Methods
Site Descriptions
  A total of 41 sites were monitored at 7 parks within the Northeast Coastal and Barrier Network, including Assateague Island National Seashore (Maryland and Virginia), Cape Cod National Seashore (Massachusetts), Colonial National Historical Park (Virginia), Fire Island National Seashore (New York), Gateway National Recreation Area (New Jersey and New York), George Washington Birthplace National Monument (Virginia), and Sagamore Hill National Historic Site (New York) (Figure 1). Salt marsh vegetation cover was monitored between 1997 to 2018 (Table 1).

 

Figure.1  

Table 1. Site count, plot count, monitoring years, and count of sampling events at each park.

Park Unit

Unit Code

Location

Number of Sites

Number of Plots

Sample Years

Sampling Events

Assateague Island National Seashore

ASIS

MD, VA

9

2,180

2008, 2010, 2012, 2014, 2016, 2018

6

Cape Cod National Seashore

CACO

MA

10

2,293

1997, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013

11

Colonial National Historical Park

COLO

VA

8

1,043

2008, 2010, 2012, 2014, 2016

5

Fire Island National Seashore

FIIS

NY

9

2,396

2009, 2011, 2013, 2015, 2017

5

Gateway National Recreation Area

GATE

NJ, NY

3

414

2010, 2012, 2014, 2016, 2018

5

George Washington Birthplace National Monument

GEWA

VA

1

140

2008, 2010, 2012

3

Sagamore Hill National Historic Site

SAHI

NY

1

227

2009, 2011, 2013, 2015, 2017

5

Sampling Protocol
  x, y, z.

 

Results
  In total, we identified 280 unique plant species within the salt marshes at all 7 parks. Mean plot species richness varied from 1.7 at SAHI to 3.4 at CACO (mean: 2.5 ± 0.3; Table 2). Max plot species richness varied from 1.8972222 at GATE to 6.9219858 at CACO (mean: 3 ± 1; Table 2).

Total species richness varied from 18 at SAHI to 189 at CACO (mean: 68 ± 21; Table 2). The number of species that were unique to each park varied from 2 at SAHI to 123 at CACO (mean: 27 ± 16; Table 2).

  Mean plot species richness remained low (between 1.2 to 3.6) throughout the study period at all parks except CACO (Figure 1). At CACO, mean plot species richness fluctuated greatly between the beginning of the study period in 1997 to 2005 (min: 2.0 in 2003; max: 6.9 in 2000) - most likely due to the fact that different sites (and different numbers of sites) were sampled in each sampling year, in contrast to the other parks where the same sites were sampled every time. (Figure 1). Between 2005 to 2018 however, mean plot species richness at CACO stabilized between 2.2 and 3.1, similar to the other 6 parks.

 

Table 2. Plant species richness within the salt marshes at each park.

Park Unit

Mean Plot Richness

Max Plot Richness

Total Richness

Unique Species Count

ASIS

2.1

2.432972

42

5

CACO

3.4

6.921986

189

123

COLO

2.9

2.995000

63

19

FIIS

2.6

2.782237

59

8

GATE

1.7

1.897222

58

26

GEWA

3.4

3.619048

44

4

SAHI

1.7

2.200000

18

2

mean (± 1 SE)

2.5 ± 0.3

3 ± 1

68 ± 21

27 ± 16

 

 

Rare, Threatened & Endangered Species
  Only 1 rare species - Myrica gale at GATE - was identified across all parks. Myrica gale was only found in one plot in 2017 at GATE. No federally listed threatened or endangered species were found at any of the parks.

 

Invasive, Noxious & Prohibited Species
  Of the 280 unique species identified across all parks, 10 were considered invasive, noxious, or prohibited within their respective states (Table 3). No invasive species were found in ASIS, GEWA, or SAHI. At CACO, 5 species, including Celastrus orbiculatus, Lonicera japonica, Lythrum salicaria, Phalaris arundinacea, and Phragmites australis were considered invasive by the Massachusetts Invasive Plant Advisory Group (https://massnrc.org/mipag/index.htm) (Table 3). At COLO, only 1 species - Najas minor - was considered invasive by the Virginia Department of Conservation and Recreation (https://www.dcr.virginia.gov/natural-heritage/invsppdflist) (Table 3). At FIIS, 3 species, including Elaeagnus umbellata, Phragmites australis, and Polygonum perfoliatum were considered invasive by the state of New York (State of New York, 2022) (Table 3). At GATE, 4 species, including Artemisia vulgaris, Lonicera japonica, Phragmites australis, Rubus phoenicolasius, were considered invasive by the state of New York (State of New York, 2022) (Table 3).
  Relative cover of the majority of these invasive species either remained stable over the course of the study period or were only found once (Figure 3). Of the two invasive species with increasing relative cover, Phragmites australis at CACO increased from a low of 17.7% in 2000 to a high of 96.8% in 2005, although this change may be related to differences in the number of sites used in the earlier vs. later years at CACO. Similarly, the cover of Artemisia vulgaris at GATE increased from a low of 7.5% in 2014 to a high of 91.3% in 2018 (Figure 3). Only 1 invasive species, Phalaris arundinacea at CACO decreased substantially from a high of 54.5% in 2008 to a low of 24.8% in 2013 (Figure 3).

 

Table 3. Invasive, noxious, or prohibited species found at each park.

Park unit

Species

CACO

Celastrus orbiculatus

Lonicera japonica

Lythrum salicaria

Phalaris arundinacea

Phragmites australis

COLO

Najas minor

FIIS

Elaeagnus umbellata

Phragmites australis

Polygonum perfoliatum

GATE

Artemisia vulgaris

Lonicera japonica

Phragmites australis

Rubus phoenicolasius

 

 

Wetland Species
  Of the 280 unique species identified across all parks, 147 were considered hydrophytic in the northeast wetland region (U.S. Army Corps of Engineers 2009) based on their characterization as either obligate, facultative wetland, or faculative on the National Wetland Plant List (Lichvar et al. 2016). Total wetland species richness ranged from a low of 10 at SAHI to a high of 103 at CACO (mean: 41 ± 11; Table 4).

 

Table 4. Total hydrophyte species richness at each park unit.

Park unit

Total hydrophyte species richness

ASIS

25

CACO

103

COLO

49

FIIS

37

GATE

24

GEWA

39

SAHI

10

mean (+/- 1 SE)

41 +/- 11

 

Table 5. Hydrophytic plant cover species with the top 5 highest relative
mean cover at each park accross all years.

Park unit

Species

Cover (%)

ASIS

Spartina alterniflora

53.5

Spartina patens

9.1

Distichlis spicata

8.6

Salicornia maritima

3.0

Iva frutescens

2.6

CACO

Phragmites australis

19.3

Typha angustifolia

11.5

Spartina alterniflora

11.3

Thelypteris palustris

3.7

Spartina patens

2.9

COLO

Spartina cynosuroides

16.1

Peltandra virginica

15.4

Zizania aquatica

4.0

Schoenoplectus pungens

1.9

Pontederia cordata

1.9

FIIS

Spartina alterniflora

33.7

Spartina patens

10.1

Distichlis spicata

5.6

Phragmites australis

2.3

Salicornia maritima

1.8

GATE

Spartina alterniflora

65.2

Spartina patens

9.0

Iva frutescens

3.8

Distichlis spicata

3.3

Suaeda maritima

1.6

GEWA

Spartina cynosuroides

8.4

Spartina alterniflora

7.2

Amaranthus cannabinus

4.8

Kosteletzkya virginica

2.2

Typha angustifolia

2.2

SAHI

Spartina alterniflora

74.6

Distichlis spicata

7.7

Spartina patens

7.7

Suaeda maritima

2.4

Salicornia maritima

1.6

 

 

wetland_species %>%
  filter(UnitCode == "ASIS") %>%
  group_by(UnitCode, Year_chr, SciName_cor) %>%
  summarise(mean_rel_cover = mean(rel_percent_cover, na.rm =T)) %>%
  pivot_wider(., id_cols = c("UnitCode", "Year_chr"), names_from = SciName_cor, values_from = c(mean_rel_cover), values_fill = 0) %>%
  pivot_longer(., cols = -c("UnitCode", "Year_chr"), names_to = "SciName_cor", values_to = "mean_rel_cover") %>%
  mutate(cover_category = factor(case_when(
    mean_rel_cover == 0 ~ NA,
    mean_rel_cover > 0 & mean_rel_cover < 2 ~ "b1%",
    mean_rel_cover > 2 & mean_rel_cover <= 4 ~ "c2-4%",
    mean_rel_cover > 4 & mean_rel_cover <= 9 ~ "d5-9%",
    mean_rel_cover > 9 & mean_rel_cover <= 24 ~ "e10-24%",
    mean_rel_cover > 25 & mean_rel_cover <= 49 ~ "f25-49%",
    mean_rel_cover > 49 & mean_rel_cover <= 74 ~ "g50-74%",
    mean_rel_cover > 74 ~ "h75-100%"
  ))) %>%
  mutate(SciName_cor = factor(SciName_cor, levels=rev(sort(unique(SciName_cor))))) %>%
  ggplot(., aes(x = Year_chr, y = SciName_cor, fill = cover_category)) +
  geom_tile(color = "light grey", size = 0.25) +
  scale_y_discrete(expand = c(0,0), name = "") +
  scale_x_discrete(expand = c(0,0), name = "") +
  scale_fill_brewer(type = "seq", palette = "YlGn", name = "Mean relative\ncover (%)") +
  lfeheR::theme() +
  theme_grey(base_size=8) +
  theme(
    panel.background = element_blank(),
    panel.border = element_rect(color = "black", fill = "transparent"),
    axis.ticks=element_line(linewidth=0.4)
  )

 

Discussion

Species richness per plot at all parks (except CACO prior to 2005) was similar to that of other salt marshes along the eastern Atlantic coast of North America (citations here).

Literature Cited

Lichvar, R.W., D.L. Banks, W.N. Kirchner, and N.C. Melvin. 2016. The National Wetland Plant List: 2016 wetland ratings. Phytoneuron 2016-30: 1-17. (See also the official website of the National Wetland Plant List.)

State of New York. 2022. New York Laws, Environmental Conservation § 9-170. New York Department of State. 2021. 6 New York Codes, Rules and Regulations Part 575: Prohibited and Regulated Invasive Species.

U.S. Army Corps of Engineers. 2009. Regional supplement to the Corps of Engineers Wetland Delineation Manual: Northcentral and Northeast Region. U.S. Army Corps of Engineers, Engineer Research and Development Center, Environmental Laboratory ERDC/EL TR-09-19.

Appendix 1A. Salt marsh plant species list for Assateague Island National Seashore.

Species

Common Name

USDA Symbol

Andropogon virginicus

broomsedge bluestem

ANVI2

Aster

aster

ASTER

Atriplex patula

spear saltbush

ATPA4

Baccharis halimifolia

eastern baccharis

BAHA

Carex

sedge

CAREX

Dichanthelium acuminatum var. fasciculatum

western panicgrass

DIACF

Distichlis spicata

saltgrass

DISP

Eleocharis

spikerush

ELEOC

Elymus virginicus

Virginia wildrye

ELVI3

Eragrostis

lovegrass

ERAGR

Festuca rubra

red fescue

FERU2

Ilex opaca

American holly

ILOP

Iva frutescens

Jesuit's bark

IVFR

Juncus effusus

common rush

JUEF

Juncus gerardii

saltmeadow rush

JUGE

Juncus roemerianus

needlegrass rush

JURO

Limonium carolinianum

lavender thrift

LICA17

Lythrum lineare

wand lythrum

LYLI2

Mitchella repens

partridgeberry

MIRE

Morella cerifera

wax myrtle

MOCE2

Morella pensylvanica

northern bayberry

MOPE6

Panicum virgatum

switchgrass

PAVI2

Parthenocissus quinquefolia

Virginia creeper

PAQU2

Phytolacca americana

American pokeweed

PHAM4

Pinus rigida

pitch pine

PIRI

Pinus taeda

loblolly pine

PITA

Ruppia maritima

widgeongrass

RUMA5

Salicornia

pickleweed

SALIC

Salicornia bigelovii

dwarf saltwort

SABI

Salicornia maritima

slender grasswort

SAMA11

Samolus valerandi ssp. parviflorus

seaside brookweed

SAVAP

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus pungens

common threesquare

SCPU10

Schoenoplectus pungens var. pungens

common threesquare

SCPUP5

Schoenoplectus robustus

sturdy bulrush

SCRO5

Smilax rotundifolia

roundleaf greenbrier

SMRO

Solidago sempervirens

seaside goldenrod

SOSE

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Suaeda maritima

herbaceous seepweed

SUMA

Toxicodendron radicans

eastern poison ivy

TORA2

Vitis rotundifolia

muscadine

VIRO3

 

Appendix 1B. Salt marsh plant species list for Cape Cod National Seashore.

Species

Common Name

USDA Symbol

Acer rubrum

red maple

ACRU

Achillea millefolium

common yarrow

ACMI2

Agalinis maritima

saltmarsh false foxglove

AGMA3

Agrostis gigantea

redtop

AGGI2

Agrostis hyemalis

winter bentgrass

AGHY

Agrostis perennans

upland bentgrass

AGPE

Agrostis stolonifera

creeping bentgrass

AGST2

Amelanchier

serviceberry

AMELA

Amelanchier canadensis

Canadian serviceberry

AMCA4

Ammophila breviligulata

American beachgrass

AMBR

Arctostaphylos uva-ursi

kinnikinnick

ARUV

Artemisia campestris

field sagewort

ARCA12

Artemisia stelleriana

oldwoman

ARST6

Atriplex

saltbush

ATRIP

Atriplex prostrata

triangle orache

ATPR

Baccharis halimifolia

eastern baccharis

BAHA

Betula populifolia

gray birch

BEPO

Bidens connata

purplestem beggarticks

BICO5

Boehmeria cylindrica

smallspike false nettle

BOCY

Cakile edentula

American searocket

CAED

Calamagrostis canadensis

bluejoint

CACA4

Calystegia sepium

hedge false bindweed

CASE13

Carex

sedge

CAREX

Carex canescens

silvery sedge

CACA11

Carex comosa

longhair sedge

CACO8

Carex lurida

shallow sedge

CALU5

Carex normalis

greater straw sedge

CANO

Carex scoparia

broom sedge

CASC11

Celastrus orbiculatus

Oriental bittersweet

CEOR7

Chenopodium album

lambsquarters

CHAL7

Cladonia

cup lichen

CLADO3

Cyperus filicinus

fern flatsedge

CYFI

Daucus carota

Queen Anne's lace

DACA6

Decodon verticillatus

swamp loosestrife

DEVE

Deschampsia flexuosa

wavy hairgrass

DEFL

Dichanthelium

rosette grass

DICHA2

Dichanthelium acuminatum var. fasciculatum

western panicgrass

DIACF

Distichlis spicata

saltgrass

DISP

Drosera rotundifolia

roundleaf sundew

DRRO

Elaeagnus angustifolia

Russian-olive

ELAN

Eleocharis

spikerush

ELEOC

Eleocharis tenuis

slender spikerush

ELTE

Elymus repens

quackgrass

ELRE4

Elymus virginicus

Virginia wildrye

ELVI3

Epilobium leptophyllum

bog willowherb

EPLE2

Erechtites hieraciifolia

American burnweed

ERHI2

Erechtites hieraciifolia var. hieraciifolia

American burnweed

ERHIH

Eupatoriadelphus dubius

coastal plain joe pye weed

EUDU2

Eupatoriadelphus maculatus var. bruneri

spotted joe pye weed

EUMAB

Euthamia caroliniana

slender goldentop

EUCA26

Euthamia graminifolia

flat-top goldentop

EUGR5

Festuca rubra

red fescue

FERU2

Fragaria virginiana

Virginia strawberry

FRVI

Galium

bedstraw

GALIU

Galium trifidum

threepetal bedstraw

GATR2

Gaylussacia baccata

black huckleberry

GABA

Glyceria canadensis

rattlesnake mannagrass

GLCA

Hieracium

hawkweed

HIERA

Hieracium aurantiacum

orange hawkweed

HIAU

Holcus lanatus

common velvetgrass

HOLA

Hudsonia ericoides

pine barren goldenheather

HUER

Hudsonia tomentosa

woolly beachheather

HUTO

Hypochaeris radicata

hairy cat's ear

HYRA3

Ilex verticillata

common winterberry

ILVE

Impatiens capensis

jewelweed

IMCA

Iva frutescens

Jesuit's bark

IVFR

Juncus canadensis

Canadian rush

JUCA3

Juncus effusus

common rush

JUEF

Juncus gerardii

saltmeadow rush

JUGE

Juncus greenei

Greene's rush

JUGR

Juncus tenuis

poverty rush

JUTE

Lactuca canadensis

Canada lettuce

LACA

Lathyrus japonicus

beach pea

LAJA

Lechea intermedia

largepod pinweed

LEIN

Lechea maritima

beach pinweed

LEMA

Leersia oryzoides

rice cutgrass

LEOR

Lemna

duckweed

LEMNA

Lemna minor

common duckweed

LEMI3

Limonium carolinianum

lavender thrift

LICA17

Lonicera

honeysuckle

LONIC

Lonicera japonica

Japanese honeysuckle

LOJA

Lycopus

waterhorehound

LYCOP4

Lycopus americanus

American water horehound

LYAM

Lycopus uniflorus

northern bugleweed

LYUN

Lysimachia terrestris

earth loosestrife

LYTE2

Lythrum salicaria

purple loosestrife

LYSA2

Morella pensylvanica

northern bayberry

MOPE6

Nuttallanthus canadensis

Canada toadflax

NUCA

Onoclea sensibilis

sensitive fern

ONSE

Osmunda cinnamomea

cinnamon fern

OSCI

Osmunda regalis

royal fern

OSRE

Parthenocissus quinquefolia

Virginia creeper

PAQU2

Phalaris arundinacea

reed canarygrass

PHAR3

Photinia melanocarpa

black chokeberry

PHME13

Photinia pyrifolia

red chokeberry

PHPY4

Phragmites australis

common reed

PHAU7

Pinus rigida

pitch pine

PIRI

Plantago

plantain

PLANT

Plantago maritima

goose tongue

PLMA3

Plantago maritima var. juncoides

goose tongue

PLMAJ

Platanthera clavellata

small green wood orchid

PLCL

Pluchea odorata

sweetscent

PLOD

Pluchea odorata var. odorata

sweetscent

PLODO

Poa palustris

fowl bluegrass

POPA2

Polygonella articulata

coastal jointweed

POAR4

Polygonum

knotweed

POLYG4

Polygonum arifolium

halberdleaf tearthumb

POAR6

Polygonum hydropiper

marshpepper knotweed

POHY

Polygonum sagittatum

arrowleaf tearthumb

POSA5

Populus grandidentata

bigtooth aspen

POGR4

Populus tremuloides

quaking aspen

POTR5

Potentilla simplex

common cinquefoil

POSI2

Prunus cerasifera

cherry plum

PRCE2

Prunus maritima

beach plum

PRMA2

Prunus serotina

black cherry

PRSE2

Pteridium aquilinum

western brackenfern

PTAQ

Puccinellia distans

weeping alkaligrass

PUDI

Puccinellia maritima

seaside alkaligrass

PUMA

Quercus alba

white oak

QUAL

Quercus ilicifolia

scrub oak

QUIL

Quercus velutina

black oak

QUVE

Rhus copallinum

winged sumac

RHCO

Ribes hirtellum

hairystem gooseberry

RIHI

Ribes lacustre

prickly currant

RILA

Rosa

rose

ROSA5

Rosa carolina

Carolina rose

ROCA4

Rosa palustris

swamp rose

ROPA

Rosa rugosa

rugosa rose

RORU

Rosa virginiana

Virginia rose

ROVI2

Rubus

blackberry

RUBUS

Rubus allegheniensis

Allegheny blackberry

RUAL

Rubus flagellaris

northern dewberry

RUFL

Rubus hispidus

bristly dewberry

RUHI

Rubus idaeus

American red raspberry

RUID

Rubus occidentalis

black raspberry

RUOC

Rumex

dock

RUMEX

Rumex acetosella

common sheep sorrel

RUAC3

Rumex orbiculatus

greater water dock

RUOR2

Salicornia

pickleweed

SALIC

Salicornia bigelovii

dwarf saltwort

SABI

Salicornia maritima

slender grasswort

SAMA11

Salix bebbiana

Bebb willow

SABE2

Sambucus nigra

black elderberry

SANI4

Sassafras albidum

sassafras

SAAL5

Schizachyrium scoparium

little bluestem

SCSC

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus pungens

common threesquare

SCPU10

Schoenoplectus pungens var. pungens

common threesquare

SCPUP5

Schoenoplectus robustus

sturdy bulrush

SCRO5

Scirpus cyperinus

woolgrass

SCCY

Scutellaria

skullcap

SCUTE

Scutellaria galericulata

marsh skullcap

SCGA

Sisyrinchium atlanticum

eastern blue-eyed grass

SIAT

Smilax rotundifolia

roundleaf greenbrier

SMRO

Solanum dulcamara

climbing nightshade

SODU

Solidago

goldenrod

SOLID

Solidago canadensis

Canada goldenrod

SOCA6

Solidago flexicaulis

zigzag goldenrod

SOFL2

Solidago latissimifolia

Elliott's goldenrod

SOLA4

Solidago odora

anisescented goldenrod

SOOD

Solidago rugosa

wrinkleleaf goldenrod

SORU2

Solidago sempervirens

seaside goldenrod

SOSE

Sparganium americanum

American bur-reed

SPAM

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Spergularia salina

salt sandspurry

SPSA5

Sphagnum

sphagnum

SPHAG2

Spiraea

spirea

SPIRA

Spiraea alba

white meadowsweet

SPAL2

Spiraea tomentosa

steeplebush

SPTO2

Suaeda

seepweed

SUAED

Suaeda linearis

annual seepweed

SULI

Suaeda maritima

herbaceous seepweed

SUMA

Symphyotrichum novi-belgii

New York aster

SYNO3

Symphyotrichum subulatum

eastern annual saltmarsh aster

SYSU5

Symphyotrichum tenuifolium

perennial saltmarsh aster

SYTE6

Teucrium canadense

Canada germander

TECA3

Thelypteris palustris

eastern marsh fern

THPA

Thinopyrum pycnanthum

tick quackgrass

THPY4

Toxicodendron radicans

eastern poison ivy

TORA2

Triadenum virginicum

Virginia marsh St. Johnswort

TRVI2

Typha angustifolia

narrowleaf cattail

TYAN

Vaccinium angustifolium

lowbush blueberry

VAAN

Vaccinium corymbosum

highbush blueberry

VACO

Vaccinium macrocarpon

cranberry

VAMA

Viburnum

viburnum

VIBUR

Viburnum dentatum

southern arrowwood

VIDE

Viburnum dentatum var. dentatum

southern arrowwood

VIDED4

Viola lanceolata

bog white violet

VILA4

 

Appendix 1C. Salt marsh plant species list for Colonial National Historical Park.

Species

Common Name

USDA Symbol

Acer rubrum

red maple

ACRU

Amaranthus cannabinus

tidalmarsh amaranth

AMCA2

Apios americana

groundnut

APAM

Baccharis halimifolia

eastern baccharis

BAHA

Brasenia schreberi

watershield

BRSC

Carex

sedge

CAREX

Carex hyalinolepis

shoreline sedge

CAHY3

Carex lurida

shallow sedge

CALU5

Distichlis spicata

saltgrass

DISP

Eleocharis parvula

dwarf spikerush

ELPA5

Hibiscus moscheutos

crimsoneyed rosemallow

HIMO

Hydrocotyle

hydrocotyle

HYDRO2

Hydrocotyle verticillata

whorled marshpennywort

HYVE2

Iva frutescens

Jesuit's bark

IVFR

Juncus

rush

JUNCU

Juncus effusus

common rush

JUEF

Juncus gerardii

saltmeadow rush

JUGE

Juncus roemerianus

needlegrass rush

JURO

Juncus tenuis

poverty rush

JUTE

Juniperus virginiana

eastern redcedar

JUVI

Leersia

cutgrass

LEERS

Leersia oryzoides

rice cutgrass

LEOR

Lilaeopsis chinensis

eastern grasswort

LICH

Lonicera

honeysuckle

LONIC

Lycopus

waterhorehound

LYCOP4

Lythrum lineare

wand lythrum

LYLI2

Mikania scandens

climbing hempvine

MISC

Morella cerifera

wax myrtle

MOCE2

Najas minor

brittle waternymph

NAMI

Osmunda regalis

royal fern

OSRE

Peltandra virginica

green arrow arum

PEVI

Persea borbonia

redbay

PEBO

Phragmites australis

common reed

PHAU7

Phyla lanceolata

lanceleaf fogfruit

PHLA3

Pinus rigida

pitch pine

PIRI

Pluchea odorata

sweetscent

PLOD

Polygonum

knotweed

POLYG4

Polygonum persicaria

spotted ladysthumb

POPE3

Polygonum punctatum

dotted smartweed

POPU5

Pontederia cordata

pickerelweed

POCO14

Ptilimnium capillaceum

herbwilliam

PTCA

Rumex verticillatus

swamp dock

RUVE3

Sagittaria lancifolia

bulltongue arrowhead

SALA

Sagittaria subulata

awl-leaf arrowhead

SASU

Samolus valerandi

seaside brookweed

SAVA3

Samolus valerandi ssp. parviflorus

seaside brookweed

SAVAP

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus pungens

common threesquare

SCPU10

Schoenoplectus pungens var. pungens

common threesquare

SCPUP5

Schoenoplectus robustus

sturdy bulrush

SCRO5

Schoenoplectus tabernaemontani

softstem bulrush

SCTA2

Spartina alterniflora

smooth cordgrass

SPAL

Spartina cynosuroides

big cordgrass

SPCY

Spartina patens

saltmeadow cordgrass

SPPA

Taxodium distichum

baldcypress

TADI2

Teucrium canadense

Canada germander

TECA3

Thelypteris palustris

eastern marsh fern

THPA

Toxicodendron radicans

eastern poison ivy

TORA2

Typha

cattail

TYPHA

Typha angustifolia

narrowleaf cattail

TYAN

Vitis

grape

VITIS

Zizania aquatica

annual wildrice

ZIAQ

Zizaniopsis miliacea

giant cutgrass

ZIMI

 

Appendix 1D. Salt marsh plant species list for Fire Island National Seashore.

Species

Common Name

USDA Symbol

Ammophila breviligulata

American beachgrass

AMBR

Atriplex patula

spear saltbush

ATPA4

Baccharis halimifolia

eastern baccharis

BAHA

Bassia hirsuta

hairy smotherweed

BAHI3

Bassia hyssopifolia

fivehorn smotherweed

BAHY

Cakile edentula

American searocket

CAED

Calystegia sepium

hedge false bindweed

CASE13

Cuscuta

dodder

CUSCU

Distichlis spicata

saltgrass

DISP

Elaeagnus umbellata

autumn olive

ELUM

Eleocharis

spikerush

ELEOC

Elymus virginicus

Virginia wildrye

ELVI3

Hibiscus

rosemallow

HIBIS2

Hibiscus moscheutos

crimsoneyed rosemallow

HIMO

Iva frutescens

Jesuit's bark

IVFR

Juncus

rush

JUNCU

Juncus canadensis

Canadian rush

JUCA3

Juncus effusus

common rush

JUEF

Juncus gerardii

saltmeadow rush

JUGE

Juncus roemerianus

needlegrass rush

JURO

Kosteletzkya virginica

Virginia saltmarsh mallow

KOVI

Lepidium

pepperweed

LEPID

Limonium carolinianum

lavender thrift

LICA17

Lonicera

honeysuckle

LONIC

Mikania scandens

climbing hempvine

MISC

Morella pensylvanica

northern bayberry

MOPE6

Panicum

panicgrass

PANIC

Parthenocissus quinquefolia

Virginia creeper

PAQU2

Phragmites australis

common reed

PHAU7

Pluchea odorata

sweetscent

PLOD

Polygonum perfoliatum

Asiatic tearthumb

POPE10

Polygonum punctatum

dotted smartweed

POPU5

Quercus velutina

black oak

QUVE

Rosa

rose

ROSA5

Rubus

blackberry

RUBUS

Ruppia maritima

widgeongrass

RUMA5

Salicornia

pickleweed

SALIC

Salicornia bigelovii

dwarf saltwort

SABI

Salicornia maritima

slender grasswort

SAMA11

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus pungens

common threesquare

SCPU10

Schoenoplectus pungens var. pungens

common threesquare

SCPUP5

Schoenoplectus robustus

sturdy bulrush

SCRO5

Scirpus

bulrush

SCIRP

Setaria parviflora

marsh bristlegrass

SEPA10

Smilax rotundifolia

roundleaf greenbrier

SMRO

Solidago rugosa

wrinkleleaf goldenrod

SORU2

Solidago sempervirens

seaside goldenrod

SOSE

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Suaeda

seepweed

SUAED

Suaeda maritima

herbaceous seepweed

SUMA

Symphyotrichum tenuifolium

perennial saltmarsh aster

SYTE6

Teucrium canadense

Canada germander

TECA3

Thelypteris palustris

eastern marsh fern

THPA

Toxicodendron radicans

eastern poison ivy

TORA2

Triadenum virginicum

Virginia marsh St. Johnswort

TRVI2

Typha angustifolia

narrowleaf cattail

TYAN

Vitis rotundifolia

muscadine

VIRO3

 

Appendix 1E. Salt marsh plant species list for Gateway National Recreation Area.

Species

Common Name

USDA Symbol

Acalypha rhomboidea

common threeseed mercury

ACRH

Ageratina altissima

white snakeroot

AGAL5

Amelanchier canadensis

Canadian serviceberry

AMCA4

Ammophila breviligulata

American beachgrass

AMBR

Artemisia vulgaris

common wormwood

ARVU

Atriplex cristata

crested saltbush

ATCR2

Atriplex patula

spear saltbush

ATPA4

Baccharis halimifolia

eastern baccharis

BAHA

Bassia

smotherweed

BASSI

Bassia hyssopifolia

fivehorn smotherweed

BAHY

Bidens bipinnata

Spanish needles

BIBI7

Bromus

brome

BROMU

Cakile edentula

American searocket

CAED

Calystegia sepium

hedge false bindweed

CASE13

Carex kobomugi

Japanese sedge

CAKO2

Celtis occidentalis

hackberry

CEOC

Cenchrus longispinus

mat sandbur

CELO3

Cenchrus tribuloides

sanddune sandbur

CETR

Centaurea melitensis

Maltese star-thistle

CEME2

Chamaesyce polygonifolia

seaside sandmat

CHPO6

Digitaria

crabgrass

DIGIT2

Distichlis spicata

saltgrass

DISP

Ilex opaca

American holly

ILOP

Ipomoea

morning-glory

IPOMO

Iva frutescens

Jesuit's bark

IVFR

Juniperus virginiana

eastern redcedar

JUVI

Lepidium virginicum

Virginia pepperweed

LEVI3

Limonium carolinianum

lavender thrift

LICA17

Lonicera japonica

Japanese honeysuckle

LOJA

Melilotus

sweetclover

MELIL

Mirabilis nyctaginea

heartleaf four o'clock

MINY

Myrica gale

sweetgale

MYGA

Opuntia humifusa

devil's-tongue

OPHU

Parthenocissus quinquefolia

Virginia creeper

PAQU2

Phragmites australis

common reed

PHAU7

Phytolacca americana

American pokeweed

PHAM4

Pseudognaphalium obtusifolium

rabbit-tobacco

PSOB3

Rhus copallinum var. latifolia

winged sumac

RHCOL2

Rosa rugosa

rugosa rose

RORU

Rubus pensilvanicus

Pennsylvania blackberry

RUPE3

Rubus phoenicolasius

wine raspberry

RUPH

Ruppia maritima

widgeongrass

RUMA5

Salicornia

pickleweed

SALIC

Salicornia bigelovii

dwarf saltwort

SABI

Salicornia maritima

slender grasswort

SAMA11

Salsola kali

Russian thistle

SAKA

Setaria parviflora

marsh bristlegrass

SEPA10

Smilax rotundifolia

roundleaf greenbrier

SMRO

Solanum nigrum

black nightshade

SONI

Solidago

goldenrod

SOLID

Solidago sempervirens

seaside goldenrod

SOSE

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Suaeda

seepweed

SUAED

Suaeda linearis

annual seepweed

SULI

Suaeda maritima

herbaceous seepweed

SUMA

Toxicodendron radicans

eastern poison ivy

TORA2

Xanthium strumarium

rough cocklebur

XAST

 

Appendix 1F. Salt marsh plant species list for George Washington Birthplace National Monument.

Species

Common Name

USDA Symbol

Acer rubrum

red maple

ACRU

Alnus serrulata

hazel alder

ALSE2

Amaranthus cannabinus

tidalmarsh amaranth

AMCA2

Atriplex patula

spear saltbush

ATPA4

Baccharis halimifolia

eastern baccharis

BAHA

Boehmeria cylindrica

smallspike false nettle

BOCY

Brasenia schreberi

watershield

BRSC

Cyperus

flatsedge

CYPER

Decodon verticillatus

swamp loosestrife

DEVE

Distichlis spicata

saltgrass

DISP

Elymus virginicus

Virginia wildrye

ELVI3

Galium

bedstraw

GALIU

Hibiscus moscheutos

crimsoneyed rosemallow

HIMO

Hydrocotyle verticillata

whorled marshpennywort

HYVE2

Ilex opaca

American holly

ILOP

Impatiens capensis

jewelweed

IMCA

Iva frutescens

Jesuit's bark

IVFR

Juncus effusus

common rush

JUEF

Kosteletzkya virginica

Virginia saltmarsh mallow

KOVI

Leersia oryzoides

rice cutgrass

LEOR

Lythrum lineare

wand lythrum

LYLI2

Mikania scandens

climbing hempvine

MISC

Morella cerifera

wax myrtle

MOCE2

Onoclea sensibilis

sensitive fern

ONSE

Panicum virgatum

switchgrass

PAVI2

Peltandra virginica

green arrow arum

PEVI

Phalaris arundinacea

reed canarygrass

PHAR3

Phragmites australis

common reed

PHAU7

Polygonum arifolium

halberdleaf tearthumb

POAR6

Polygonum punctatum

dotted smartweed

POPU5

Polygonum sagittatum

arrowleaf tearthumb

POSA5

Ptilimnium capillaceum

herbwilliam

PTCA

Quercus phellos

willow oak

QUPH

Rumex

dock

RUMEX

Rumex verticillatus

swamp dock

RUVE3

Saururus cernuus

lizard's tail

SACE

Schoenoplectus americanus

chairmaker's bulrush

SCAM6

Schoenoplectus robustus

sturdy bulrush

SCRO5

Smilax rotundifolia

roundleaf greenbrier

SMRO

Spartina alterniflora

smooth cordgrass

SPAL

Spartina cynosuroides

big cordgrass

SPCY

Spartina patens

saltmeadow cordgrass

SPPA

Typha angustifolia

narrowleaf cattail

TYAN

Zizania aquatica

annual wildrice

ZIAQ

 

Appendix 1G. Salt marsh plant species list for Sagamore Hill National Historic Site.

Species

Common Name

USDA Symbol

Ammophila breviligulata

American beachgrass

AMBR

Atriplex cristata

crested saltbush

ATCR2

Atriplex patula

spear saltbush

ATPA4

Bassia hyssopifolia

fivehorn smotherweed

BAHY

Distichlis spicata

saltgrass

DISP

Iva frutescens

Jesuit's bark

IVFR

Lechea maritima

beach pinweed

LEMA

Limonium carolinianum

lavender thrift

LICA17

Panicum amarum

bitter panicgrass

PAAM2

Ruppia maritima

widgeongrass

RUMA5

Salicornia

pickleweed

SALIC

Salicornia maritima

slender grasswort

SAMA11

Solidago sempervirens

seaside goldenrod

SOSE

Spartina alterniflora

smooth cordgrass

SPAL

Spartina patens

saltmeadow cordgrass

SPPA

Suaeda

seepweed

SUAED

Suaeda calceoliformis

Pursh seepweed

SUCA2

Suaeda maritima

herbaceous seepweed

SUMA

 

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCm1haW5mb250OiBUaW1lcyBOZXcgUm9tYW4NCi0tLQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGF4aXplKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGd0KQ0KbGlicmFyeShmbGV4dGFibGUpDQpsaWJyYXJ5KG9mZmljZXIpDQpsaWJyYXJ5KGV4dHJhZm9udCkNCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQ0KI2ZvbnRfaW1wb3J0KHBhdHRlcm4gPSAidGltZXMiKQ0KbG9hZGZvbnRzKGRldmljZSA9ICJ3aW4iKQ0KDQpsb2FkKGhlcmU6OmhlcmUoImRhdGEiLCAiZGVyaXZlZCIsICJ2ZWdfY2xlYW5lZC5yZGEiKSkNCmBgYA0KDQojIyMjIyAqKk1ldGhvZHMqKg0KIyMjIyMgKlNpdGUgRGVzY3JpcHRpb25zKg0KfCAgIEEgdG90YWwgb2YgYHIgcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uobl9kaXN0aW5jdChVbmlxdWVJRCkpICU+JSBwbHVjaygxKWAgc2l0ZXMgd2VyZSBtb25pdG9yZWQgYXQgNyBwYXJrcyB3aXRoaW4gdGhlIE5vcnRoZWFzdCBDb2FzdGFsIGFuZCBCYXJyaWVyIE5ldHdvcmssIGluY2x1ZGluZyBBc3NhdGVhZ3VlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSAoTWFyeWxhbmQgYW5kIFZpcmdpbmlhKSwgQ2FwZSBDb2QgTmF0aW9uYWwgU2Vhc2hvcmUgKE1hc3NhY2h1c2V0dHMpLCBDb2xvbmlhbCBOYXRpb25hbCBIaXN0b3JpY2FsIFBhcmsgKFZpcmdpbmlhKSwgRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUgKE5ldyBZb3JrKSwgR2F0ZXdheSBOYXRpb25hbCBSZWNyZWF0aW9uIEFyZWEgKE5ldyBKZXJzZXkgYW5kIE5ldyBZb3JrKSwgR2VvcmdlIFdhc2hpbmd0b24gQmlydGhwbGFjZSBOYXRpb25hbCBNb251bWVudCAoVmlyZ2luaWEpLCBhbmQgU2FnYW1vcmUgSGlsbCBOYXRpb25hbCBIaXN0b3JpYyBTaXRlIChOZXcgWW9yaykgKEZpZ3VyZSAxKS4gU2FsdCBtYXJzaCB2ZWdldGF0aW9uIGNvdmVyIHdhcyBtb25pdG9yZWQgYmV0d2VlbiBgciBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShtaW4oYXMubnVtZXJpYyhZZWFyX2NocikpKSAlPiUgcGx1Y2soMSlgIHRvIGByIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKG1heChhcy5udW1lcmljKFllYXJfY2hyKSkpICU+JSBwbHVjaygxKWAgKFRhYmxlIDEpLg0KJm5ic3A7DQoNCiFbRmlndXJlLjFdKHZlZ19uZWt0b25fc2l0ZV9tYXAuanBnKQ0KJm5ic3A7DQoNCmBgYHtyIHNldCBmbGV4dGFibGUgZGVmYXVsdHMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0Kc2V0X2ZsZXh0YWJsZV9kZWZhdWx0cygNCiAgZm9udC5zaXplID0gMTIsDQogIGZvbnQuZmFtaWx5ID0gInRpbWVzIG5ldyByb21hbiIsDQogIHBhZGRpbmcgPSAxDQogICkNCmBgYA0KDQpgYGB7ciBUYWJsZSAxLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2Uoc2l0ZV9jb3VudCA9IG5fZGlzdGluY3QoVW5pcXVlSUQpLA0KICAgICAgICAgICAgcGxvdF9jb3VudCA9IG5fZGlzdGluY3QoRXZlbnRJRCksDQogICAgICAgICAgICBtaW5feWVhciA9IG1pbihhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBtYXhfeWVhciA9IG1heChhcy5udW1lcmljKFllYXJfY2hyKSksDQogICAgICAgICAgICBzYW1wbGVfZXZlbnRzID0gbl9kaXN0aW5jdChZZWFyX2NociksDQogICAgICAgICAgICB5ZWFyc19zYW1wbGVkID0gdG9TdHJpbmcodW5pcXVlKHNvcnQoWWVhcl9jaHIpKSkpICU+JSANCiAgbXV0YXRlKGZ1bGxfcGFya19uYW1lID0gY2FzZV93aGVuKA0KICAgIFVuaXRDb2RlID09ICJBU0lTIiB+ICJBc3NhdGVhZ3VlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSIsDQogICAgVW5pdENvZGUgPT0gIkNBQ08iIH4gIkNhcGUgQ29kIE5hdGlvbmFsIFNlYXNob3JlIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIiwNCiAgICBVbml0Q29kZSA9PSAiRklJUyIgfiAiRmlyZSBJc2xhbmQgTmF0aW9uYWwgU2Vhc2hvcmUiLA0KICAgIFVuaXRDb2RlID09ICJHQVRFIiB+ICJHYXRld2F5IE5hdGlvbmFsIFJlY3JlYXRpb24gQXJlYSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiLA0KICAgIFVuaXRDb2RlID09ICJTQUhJIiB+ICJTYWdhbW9yZSBIaWxsIE5hdGlvbmFsIEhpc3RvcmljIFNpdGUiDQogICksDQogICAgU3RhdGUgPSBjYXNlX3doZW4oDQogICAgVW5pdENvZGUgPT0gIkFTSVMiIH4gIk1ELCBWQSIsDQogICAgVW5pdENvZGUgPT0gIkNBQ08iIH4gIk1BIiwNCiAgICBVbml0Q29kZSA9PSAiQ09MTyIgfiAiVkEiLA0KICAgIFVuaXRDb2RlID09ICJGSUlTIiB+ICJOWSIsDQogICAgVW5pdENvZGUgPT0gIkdBVEUiIH4gIk5KLCBOWSIsDQogICAgVW5pdENvZGUgPT0gIkdFV0EiIH4gIlZBIiwNCiAgICBVbml0Q29kZSA9PSAiU0FISSIgfiAiTlkiDQogICAgICAgICkpICU+JQ0KZmxleHRhYmxlKC4sIGNvbF9rZXlzID0gYygiZnVsbF9wYXJrX25hbWUiLCAiVW5pdENvZGUiLCAiU3RhdGUiLCAic2l0ZV9jb3VudCIsICJwbG90X2NvdW50IiwgInllYXJzX3NhbXBsZWQiLCAic2FtcGxlX2V2ZW50cyIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMoLiwgd2lkdGggPSAxLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDEuIFNpdGUgY291bnQsIHBsb3QgY291bnQsIG1vbml0b3JpbmcgeWVhcnMsIGFuZCBjb3VudCBvZiBzYW1wbGluZyBldmVudHMgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgZnVsbF9wYXJrX25hbWUgPSAiUGFyayBVbml0IiwgVW5pdENvZGUgPSAiVW5pdCBDb2RlIiwgU3RhdGUgPSAiTG9jYXRpb24iLCBzaXRlX2NvdW50ID0gIk51bWJlciBvZiBTaXRlcyIsIHBsb3RfY291bnQgPSAiTnVtYmVyIG9mIFBsb3RzIiwgeWVhcnNfc2FtcGxlZCA9ICJTYW1wbGUgWWVhcnMiLCBzYW1wbGVfZXZlbnRzID0gIlNhbXBsaW5nIEV2ZW50cyIpICU+JQ0KICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gYyg2OjcpLCBiaWcubWFyayA9ICIiLCBkaWdpdHMgPSAwKSAlPiUNCiAgcGFkZGluZyguLCBwYXJ0ID0gImJvZHkiLCBwYWRkaW5nLnRvcCA9IDMsIHBhZGRpbmcuYm90dG9tID0gMykgDQogIA0KYGBgDQojIyMjIyAqU2FtcGxpbmcgUHJvdG9jb2wqDQp8ICAgeCwgeSwgei4NCiZuYnNwOw0KDQojIyMjIyAqKlJlc3VsdHMqKg0KYGBge3IgU3BlY2llcyBjb3VudCwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQojIFNwZWNpZXMgcmljaG5lc3MgLSB0b3RhbCBhbGwgcGFya3MNCnRvdGFsX3NwZWNpZXMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICBwdWxsKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KDQpwYXJrX3NwZWNpZXNfcmljaG5lc3MgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSwNCiAgICAgICAgICAgIHBsb3RfbnVtID0gbl9kaXN0aW5jdChFdmVudElEKSwNCiAgICAgICAgICAgIHNpdGVfbnVtID0gbl9kaXN0aW5jdChVbmlxdWVJRCksDQogICAgICAgICAgICBjb3VudF9wZXJfcGxvdCA9IHRvdGFsX2NvdW50L3Bsb3RfbnVtLA0KICAgICAgICAgICAgY291bnRfcGVyX3NpdGUgPSB0b3RhbF9jb3VudC9zaXRlX251bSkNCg0KcGFya19zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBTY2lOYW1lX2NvcikgJT4lDQogIHVuaXF1ZSgpDQoNCiMgU3BlY2llcyByaWNobmVzcyBwZXIgcGxvdA0KcGxvdF9udW1zX3Blcl95ZWFyIDwtIHZlZyAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXIpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpKQ0KDQpwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KEV2ZW50SUQsIFVuaXF1ZUlELCBVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2Uoc3BlY2llc19jb3VudCA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgZ3JvdXBfYnkoVW5pcXVlSUQsIFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIG11dGF0ZSh0b3RhbF9wbG90cyA9IG5fZGlzdGluY3QoRXZlbnRJRCkpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSBzdW0oc3BlY2llc19jb3VudCkvbWVhbih0b3RhbF9wbG90cykpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyID0gbWVhbihtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykpICU+JQ0KICBtdXRhdGUoWWVhciA9IGFzLm51bWVyaWMoWWVhcl9jaHIpKQ0KDQpjb3VudF91bmlxdWVfZnVuIDwtIGZ1bmN0aW9uKHBhcmspIHsNCiAgc2V0ZGlmZihwYXJrX3NwZWNpZXMgJT4lIA0KICAgICAgICAgICAgZmlsdGVyKFVuaXRDb2RlID09IHBhcmspICU+JQ0KICAgICAgICAgICAgc2VsZWN0KC1Vbml0Q29kZSksDQogICAgICAgICAgcGFya19zcGVjaWVzICU+JQ0KICAgICAgICAgICAgZmlsdGVyKFVuaXRDb2RlICE9IHBhcmspICU+JQ0KICAgICAgICAgICAgc2VsZWN0KC1Vbml0Q29kZSkpICU+JQ0KICAgIGNvdW50KCkgJT4lDQogICAgcHVsbCgpDQp9DQoNCmNvdW50X3VuaXF1ZSA8LSBwYXJrX3NwZWNpZXNfcmljaG5lc3MgJT4lDQogIHNlbGVjdCgtdG90YWxfY291bnQpICU+JQ0KICBtdXRhdGUoY291bnRfdW5pcXVlID0gbWFwX2RibChVbml0Q29kZSwgfmNvdW50X3VuaXF1ZV9mdW4oLngpKSkNCg0KcGxvdF9zcGVjaWVzX3JpY2huZXNzIDwtIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzID0gbWVhbihtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIpLA0KICAgICAgICAgICAgbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9IG1heChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIpKSAlPiUNCiAgbGVmdF9qb2luKC4sIHBhcmtfc3BlY2llc19yaWNobmVzcywgYnkgPSAiVW5pdENvZGUiKSAlPiUNCiAgbGVmdF9qb2luKC4sIGNvdW50X3VuaXF1ZSwgYnkgPSAiVW5pdENvZGUiKQ0KYGBgDQoNCnwgICBJbiB0b3RhbCwgd2UgaWRlbnRpZmllZCBgciBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvcikgJT4lIHN1bW1hcmlzZShuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lICBwdWxsKCkgJT4lIGFzLm51bWVyaWMoKWAgdW5pcXVlIHBsYW50IHNwZWNpZXMgd2l0aGluIHRoZSBzYWx0IG1hcnNoZXMgYXQgYWxsIDcgcGFya3MuIE1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIHZhcmllZCBmcm9tIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywxKSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywxKSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIChtZWFuOiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKG1lYW4obWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLCAxKSkgJT4lIHB1bGwoKWAgwrEgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShyb3VuZChzZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpKSwgMSkpICU+JSBwdWxsKClgOyBUYWJsZSAyKS4gTWF4IHBsb3Qgc3BlY2llcyByaWNobmVzcyB2YXJpZWQgZnJvbSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MsIG4gPSAxKSAlPiUgc2VsZWN0KG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MpICU+JSBwdWxsKClgIGF0IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcywgbiA9IDEpICU+JSBzZWxlY3QobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzLCBuID0gMSkgJT4lIHNlbGVjdChVbml0Q29kZSkgJT4lIHB1bGwoKWAgKG1lYW46IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQobWVhbihtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSwgMCkpICU+JSBwdWxsKClgIMKxIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQoc2QobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgobWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcykpLCAwKSkgJT4lIHB1bGwoKWA7IFRhYmxlIDIpLg0KVG90YWwgc3BlY2llcyByaWNobmVzcyB2YXJpZWQgZnJvbSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IHRvdGFsX2NvdW50LCBuID0gMSkgJT4lIHNlbGVjdCh0b3RhbF9jb3VudCkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSB0b3RhbF9jb3VudCwgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIHRvIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gdG90YWxfY291bnQsIG4gPSAxKSAlPiUgc2VsZWN0KHRvdGFsX2NvdW50KSAlPiUgcHVsbCgpYCBhdCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IHRvdGFsX2NvdW50LCBuID0gMSkgJT4lIHNlbGVjdChVbml0Q29kZSkgJT4lIHB1bGwoKWAgKG1lYW46IGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQobWVhbih0b3RhbF9jb3VudCksIDApKSAlPiUgcHVsbCgpYCDCsSBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKHNkKHRvdGFsX2NvdW50KS9zcXJ0KGxlbmd0aCh0b3RhbF9jb3VudCkpLCAwKSkgJT4lIHB1bGwoKWA7IFRhYmxlIDIpLiBUaGUgbnVtYmVyIG9mIHNwZWNpZXMgdGhhdCB3ZXJlIHVuaXF1ZSB0byBlYWNoIHBhcmsgdmFyaWVkIGZyb20gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBjb3VudF91bmlxdWUsIG4gPSAxKSAlPiUgc2VsZWN0KGNvdW50X3VuaXF1ZSkgJT4lIHB1bGwoKWAgYXQgYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBjb3VudF91bmlxdWUsIG4gPSAxKSAlPiUgc2VsZWN0KFVuaXRDb2RlKSAlPiUgcHVsbCgpYCB0byBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGNvdW50X3VuaXF1ZSwgbiA9IDEpICU+JSBzZWxlY3QoY291bnRfdW5pcXVlKSAlPiUgcHVsbCgpYCBhdCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGNvdW50X3VuaXF1ZSwgbiA9IDEpICU+JSBzZWxlY3QoVW5pdENvZGUpICU+JSBwdWxsKClgIChtZWFuOiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3MgJT4lIHVuZ3JvdXAoKSAlPiUgc3VtbWFyaXNlKHJvdW5kKG1lYW4oY291bnRfdW5pcXVlKSwgMCkpICU+JSBwdWxsKClgIMKxIGByIHBsb3Rfc3BlY2llc19yaWNobmVzcyAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2Uocm91bmQoc2QoY291bnRfdW5pcXVlKS9zcXJ0KGxlbmd0aChjb3VudF91bmlxdWUpKSwgMCkpICU+JSBwdWxsKClgOyBUYWJsZSAyKS4NCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMqTm90ZTogYWNjb3JkaW5nIHRvIHRoZSBWZWdhbiBwYWNrYWdlIGRvY3MsIHlvdSBjYW4gdXNlIGVpdGhlciBhYnVuZGFuY2UgKGNvdW50cykgb3IgcGVyY2VudCBjb3Zlcg0KcGxvdF9udW1zX3Blcl95ZWFyX3Blcl9zaXRlIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBVbmlxdWVJRCwgWWVhcl9jaHIpICU+JQ0KICBzdW1tYXJpc2UocGxvdF9udW0gPSBuX2Rpc3RpbmN0KEV2ZW50SUQpKQ0KDQphPC1wbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGRwbHlyOjpzZWxlY3QoVW5pdENvZGUsIFVuaXF1ZUlELCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFVuaXF1ZUlELCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBzdW1tYXJpc2UoY292ZXIgPSBtZWFuKHJlbF9wZXJjZW50X2NvdmVyLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgI2ZpbHRlcihjb21wbGV0ZS5jYXNlcyhjb3ZlcikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgVW5pcXVlSUQsIFllYXJfY2hyKSAlPiUNCiAgbmVzdCgpICU+JQ0KICBtdXRhdGUod2lkZSA9IG1hcChkYXRhLCB+cGl2b3Rfd2lkZXIoLngsIG5hbWVzX2Zyb20gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfZnJvbSA9ICJjb3ZlciIpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoLikpLA0KICAgICAgICAgc3BlY251bWJlciA9IG1hcF9kYmwod2lkZSwgfnZlZ2FuOjpzcGVjbnVtYmVyKC54KSkpICU+JQ0KICBsZWZ0X2pvaW4oLiwgcGxvdF9udW1zX3Blcl95ZWFyX3Blcl9zaXRlLCBieSA9IGMoIlVuaXRDb2RlIiwgIlVuaXF1ZUlEIiwgIlllYXJfY2hyIikpICU+JQ0KICBtdXRhdGUoYWRqX3NwZWNfbnVtYmVyID0gc3BlY251bWJlci9wbG90X251bSkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBVbmlxdWVJRCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2Fkal9zcGVjX251bWJlciA9IG1lYW4oYWRqX3NwZWNfbnVtYmVyKSkgDQogIA0Ka3J1c2thbC50ZXN0KG1lYW5fYWRqX3NwZWNfbnVtYmVyIH4gVW5pdENvZGUsIGRhdGEgPSBhKQ0KYiA8LSBGU0E6OmR1bm5UZXN0KG1lYW5fYWRqX3NwZWNfbnVtYmVyIH4gZmFjdG9yKFVuaXRDb2RlKSwgZGF0YSA9IGEsIG1ldGhvZCA9ICJib25mZXJyb25pIikkcmVzDQpyY29tcGFuaW9uOjpjbGRMaXN0KGNvbXBhcmlzb24gPSBiJENvbXBhcmlzb24sIHAudmFsdWUgPSBiJFAuYWRqLCB0aHJlc2hvbGQgPSAwLjA1KQ0KYGBgDQoNCnwgICBNZWFuIHBsb3Qgc3BlY2llcyByaWNobmVzcyByZW1haW5lZCBsb3cgKGJldHdlZW4gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIDEpKSAlPiUgcHVsbChtKWAgdG8gYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIoVW5pdENvZGUgIT0gIkNBQ08iKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCBuID0gMSkgJT4lIG11dGF0ZShtID0gcm91bmQobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCAxKSkgJT4lIHB1bGwobSlgKSB0aHJvdWdob3V0IHRoZSBzdHVkeSBwZXJpb2QgYXQgYWxsIHBhcmtzIGV4Y2VwdCBDQUNPIChGaWd1cmUgMSkuIEF0IENBQ08sIG1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIGZsdWN0dWF0ZWQgZ3JlYXRseSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0dWR5IHBlcmlvZCBpbiAxOTk3IHRvIDIwMDUgKG1pbjogYHIgcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCBuID0gMSkgJT4lIG11dGF0ZShtID0gZm9ybWF0KHJvdW5kKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgMSksbnNtYWxsID0gMSkpICU+JSBwdWxsKG0pYCBpbiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXJfY2hyKSAlPiUgcHVsbCgpYDsgbWF4OiBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSBmb3JtYXQocm91bmQobWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyLCAxKSxuc21hbGwgPSAxKSkgJT4lIHB1bGwobSlgIGluIGByIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJDQUNPIikgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgbiA9IDEpICU+JSBzZWxlY3QoWWVhcl9jaHIpICU+JSBwdWxsKClgKSAtIG1vc3QgbGlrZWx5IGR1ZSB0byB0aGUgZmFjdCB0aGF0IGRpZmZlcmVudCBzaXRlcyAoYW5kIGRpZmZlcmVudCBudW1iZXJzIG9mIHNpdGVzKSB3ZXJlIHNhbXBsZWQgaW4gZWFjaCBzYW1wbGluZyB5ZWFyLCBpbiBjb250cmFzdCB0byB0aGUgb3RoZXIgcGFya3Mgd2hlcmUgdGhlIHNhbWUgc2l0ZXMgd2VyZSBzYW1wbGVkIGV2ZXJ5IHRpbWUuIChGaWd1cmUgMSkuIEJldHdlZW4gMjAwNSB0byAyMDE4IGhvd2V2ZXIsIG1lYW4gcGxvdCBzcGVjaWVzIHJpY2huZXNzIGF0IENBQ08gc3RhYmlsaXplZCBiZXR3ZWVuIGByIHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBZZWFyID4gMjAwNSkgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwgbiA9IDEpICU+JSBtdXRhdGUobSA9IHJvdW5kKG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95ciwxKSkgJT4lIHB1bGwobSlgIGFuZCBgciBwbG90X3NwZWNpZXNfcmljaG5lc3NfcGVyX3lyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgWWVhciA+IDIwMDUpICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsMSkpICU+JSBwdWxsKG0pYCwgc2ltaWxhciB0byB0aGUgb3RoZXIgNiBwYXJrcy4gIA0KJm5ic3A7DQoNCmBgYHtyIFRhYmxlIDIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZmxleHRhYmxlKHBsb3Rfc3BlY2llc19yaWNobmVzcywgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcyIsICJtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzIiwgInRvdGFsX2NvdW50IiwgImNvdW50X3VuaXF1ZSIpKSAlPiUNCiAgYWxpZ24oLiwgYWxpZ24gPSAiY2VudGVyIiwgcGFydCA9ICJhbGwiKSAlPiUNCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMoLiwgd2lkdGggPSAxLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDIuIFBsYW50IHNwZWNpZXMgcmljaG5lc3Mgd2l0aGluIHRoZSBzYWx0IG1hcnNoZXMgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayBVbml0IiwgbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MgPSAiTWVhbiBQbG90IFJpY2huZXNzIiwgbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyA9ICJNYXggUGxvdCBSaWNobmVzcyIsIHRvdGFsX2NvdW50ID0gIlRvdGFsIFJpY2huZXNzIiwgY291bnRfdW5pcXVlID0gIlVuaXF1ZSBTcGVjaWVzIENvdW50IikgJT4lDQogIGFsaWduKC4sIGkgPSAxLCBhbGlnbiA9ICJsZWZ0IiwgcGFydCA9ICJoZWFkZXIiKSAlPiUNCiAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICBjb2xmb3JtYXRfZG91YmxlKC4sIGogPSAyLCBkaWdpdHMgPSAxKSAlPiUNCiAgYWRkX2Zvb3Rlcl9yb3coLiwgdmFsdWVzID0gYygibWVhbiAowrEgMSBTRSkiLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkbWVhbl9wbG90X3NwZWNpZXNfcmljaG5lc3MpLDEpLCAiIMKxICIsIHJvdW5kKHNkKHBsb3Rfc3BlY2llc19yaWNobmVzcyRtZWFuX3Bsb3Rfc3BlY2llc19yaWNobmVzcykvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzKSksMSkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkbWF4X3Bsb3Rfc3BlY2llc19yaWNobmVzcyksMCksICIgwrEgIiwgcm91bmQoc2QocGxvdF9zcGVjaWVzX3JpY2huZXNzJG1heF9wbG90X3NwZWNpZXNfcmljaG5lc3MpL3NxcnQobGVuZ3RoKHBsb3Rfc3BlY2llc19yaWNobmVzcyRtYXhfcGxvdF9zcGVjaWVzX3JpY2huZXNzKSksMCkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkdG90YWxfY291bnQpLDApLCAiIMKxICIsIHJvdW5kKHNkKHBsb3Rfc3BlY2llc19yaWNobmVzcyR0b3RhbF9jb3VudCkvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJHRvdGFsX2NvdW50KSksMCkpLCBwYXN0ZTAocm91bmQobWVhbihwbG90X3NwZWNpZXNfcmljaG5lc3MkY291bnRfdW5pcXVlKSwgMCksICIgwrEgIiwgcm91bmQoc2QocGxvdF9zcGVjaWVzX3JpY2huZXNzJGNvdW50X3VuaXF1ZSkvc3FydChsZW5ndGgocGxvdF9zcGVjaWVzX3JpY2huZXNzJGNvdW50X3VuaXF1ZSkpLDApKSksIGNvbHdpZHRocyA9IGMoMSwxLDEsMSwxKSkgJT4lIA0KICBobGluZSguLCBpID0gNywgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIGhsaW5lKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMiksIHBhcnQgPSAiZm9vdGVyIikgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiZm9vdGVyIikNCmBgYA0KJm5ic3A7DQpgYGB7ciBGaWd1cmUgMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGZpZy53aWR0aCA9IDUuODU0MTY3LCBmaWcuaGVpZ2h0ID0gMy4yMDgzMzMsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBmaWcuY2FwPSAiRmlndXJlIDIuIC4uLiIgfQ0KZ2dwbG90KHBsb3Rfc3BlY2llc19yaWNobmVzc19wZXJfeXIsIGFlcyh4ID0gWWVhciwgeSA9IG1lYW5fcGxvdF9zcGVjaWVzX3JpY2huZXNzX3Blcl95cikpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFVuaXRDb2RlKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFVuaXRDb2RlKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDEwKSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpLCBuYW1lID0gIk1lYW4gcGxvdCByaWNobmVzcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHNlYy5heGlzID0gZHVwX2F4aXMoKSwgbmFtZSA9ICJZZWFyIikgKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiUGFyayIpKSArDQogIGxmZWhlUjo6dGhlbWUoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoDQogICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAic2VyaWYiLCBzaXplID0gMTIpLA0KICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpDQogICkNCmBgYA0KJm5ic3A7DQoNCiMjIyMjICpSYXJlLCBUaHJlYXRlbmVkICYgRW5kYW5nZXJlZCBTcGVjaWVzKg0KYGBge3IgUmFyZSBzcGVjaWVzIGNvdW50LCBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCnJhcmVfc3BlY2llcyA8LSBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHNlbGVjdChVbml0Q29kZSwgU2NpTmFtZV9jb3IsIHN0YXJ0c193aXRoKCJyYXJlXyIpKSAlPiUNCiAgbXV0YXRlKGlzX3JhcmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJyYXJlXyIpLCB+IC54ID09ICJUIikgfiAiVCIpKSAlPiUNCiAgZmlsdGVyKGlzX3JhcmUgPT0gIlQiKQ0KDQp0b3RhbF9yYXJlX3NwZWNpZXMgPC0gcmFyZV9zcGVjaWVzICU+JQ0KICBzdW1tYXJpc2Uobl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JQ0KICBwdWxsKCkgJT4lDQogIGFzLm51bWVyaWMoKQ0KYGBgDQoNCnwgICBPbmx5IGByIHJhcmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJHQVRFIikgJT4lIHN1bW1hcmlzZShtID0gbl9kaXN0aW5jdChTY2lOYW1lX2NvcikpICU+JSBwdWxsKClgIHJhcmUgc3BlY2llcyAtICpgciByYXJlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIpICU+JSBzdW1tYXJpc2UobSA9IHVuaXF1ZShTY2lOYW1lX2NvcikpICU+JSBwdWxsKClgKiBhdCBHQVRFIC0gd2FzIGlkZW50aWZpZWQgYWNyb3NzIGFsbCBwYXJrcy4gKmByIHJhcmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJHQVRFIikgJT4lIHN1bW1hcmlzZShtID0gdW5pcXVlKFNjaU5hbWVfY29yKSkgJT4lIHB1bGwoKWAqIHdhcyBvbmx5IGZvdW5kIGluIG9uZSBwbG90IGluIDIwMTcgYXQgR0FURS4gTm8gZmVkZXJhbGx5IGxpc3RlZCB0aHJlYXRlbmVkIG9yIGVuZGFuZ2VyZWQgc3BlY2llcyB3ZXJlIGZvdW5kIGF0IGFueSBvZiB0aGUgcGFya3MuDQombmJzcDsNCg0KYGBge3IgSW52YXNpdmUgc3BlY2llcyBjb3VudCwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQppbnZhc2l2ZV9zcGVjaWVzIDwtIHBsb3RfdmVnX2NvdmVyX3VzZGEgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IsIHJlbF9wZXJjZW50X2NvdmVyLCBzdGFydHNfd2l0aCgiaW52YXNpdmVfIikpICU+JQ0KICBtdXRhdGUoaXNfaW52YXNpdmUgPSBjYXNlX3doZW4oaWZfYW55KHN0YXJ0c193aXRoKCJpbnZhc2l2ZV8iKSwgfiAueCA9PSAiVCIpIH4gIlQiKSkgJT4lDQogIGZpbHRlcihpc19pbnZhc2l2ZSA9PSAiVCIpDQoNCnRvdGFsX2ludmFzaXZlX3NwZWNpZXMgPC0gaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgc3VtbWFyaXNlKG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUNCiAgcHVsbCgpICU+JQ0KICBhcy5udW1lcmljKCkNCg0KaW52YXNpdmVfc3BlY2llc19ieV9wYXJrIDwtIGludmFzaXZlX3NwZWNpZXMgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBhcnJhbmdlKFVuaXRDb2RlLCBTY2lOYW1lX2NvcikNCg0KaW52YXNpdmVfY292ZXJfcGVyX3llYXIgPC0gaW52YXNpdmVfc3BlY2llcyAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5pbnRlZ2VyKFllYXJfY2hyKSkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyLCBTY2lOYW1lX2NvcikgJT4lDQogIHN1bW1hcmlzZShpbnZhc2l2ZV9jb3ZlciA9IG1lYW4ocmVsX3BlcmNlbnRfY292ZXIpKQ0KYGBgDQoNCiMjIyMjICpJbnZhc2l2ZSwgTm94aW91cyAmIFByb2hpYml0ZWQgU3BlY2llcyoNCnwgICBPZiB0aGUgYHIgdG90YWxfc3BlY2llc2AgdW5pcXVlIHNwZWNpZXMgaWRlbnRpZmllZCBhY3Jvc3MgYWxsIHBhcmtzLCBgciB0b3RhbF9pbnZhc2l2ZV9zcGVjaWVzYCB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUsIG5veGlvdXMsIG9yIHByb2hpYml0ZWQgd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGVzIChUYWJsZSAzKS4gTm8gaW52YXNpdmUgc3BlY2llcyB3ZXJlIGZvdW5kIGluIEFTSVMsIEdFV0EsIG9yIFNBSEkuIEF0IENBQ08sIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpDZWxhc3RydXMgb3JiaWN1bGF0dXMqLCAqTG9uaWNlcmEgamFwb25pY2EqLCAqTHl0aHJ1bSBzYWxpY2FyaWEqLCAqUGhhbGFyaXMgYXJ1bmRpbmFjZWEqLCBhbmQgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW52YXNpdmUgUGxhbnQgQWR2aXNvcnkgR3JvdXAgKDxodHRwczovL21hc3NucmMub3JnL21pcGFnL2luZGV4Lmh0bT4pIChUYWJsZSAzKS4gQXQgQ09MTywgb25seSBgciBpbnZhc2l2ZV9zcGVjaWVzICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNPTE8iKSAlPiUgdW5ncm91cCgpICU+JSByZWZyYW1lKG0gPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lIHB1bGwobSlgIHNwZWNpZXMgLSAqYHIgaW52YXNpdmVfc3BlY2llcyAlPiUgZmlsdGVyKFVuaXRDb2RlID09ICJDT0xPIikgJT4lIHVuZ3JvdXAoKSAlPiUgcHVsbChTY2lOYW1lX2NvcilgKiAtIHdhcyBjb25zaWRlcmVkIGludmFzaXZlIGJ5IHRoZSBWaXJnaW5pYSBEZXBhcnRtZW50IG9mIENvbnNlcnZhdGlvbiBhbmQgUmVjcmVhdGlvbiAoPGh0dHBzOi8vd3d3LmRjci52aXJnaW5pYS5nb3YvbmF0dXJhbC1oZXJpdGFnZS9pbnZzcHBkZmxpc3Q+KSAoVGFibGUgMykuIEF0IEZJSVMsIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiRklJUyIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpFbGFlYWdudXMgdW1iZWxsYXRhKiwgKlBocmFnbWl0ZXMgYXVzdHJhbGlzKiwgYW5kICpQb2x5Z29udW0gcGVyZm9saWF0dW0qIHdlcmUgY29uc2lkZXJlZCBpbnZhc2l2ZSBieSB0aGUgc3RhdGUgb2YgTmV3IFlvcmsgKFN0YXRlIG9mIE5ldyBZb3JrLCAyMDIyKSAoVGFibGUgMykuIEF0IEdBVEUsIGByIGludmFzaXZlX3NwZWNpZXMgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIpICU+JSB1bmdyb3VwKCkgJT4lIHJlZnJhbWUobSA9IG5fZGlzdGluY3QoU2NpTmFtZV9jb3IpKSAlPiUgcHVsbChtKWAgc3BlY2llcywgaW5jbHVkaW5nICpBcnRlbWlzaWEgdnVsZ2FyaXMqLCAqTG9uaWNlcmEgamFwb25pY2EqLCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqLCAqUnVidXMgcGhvZW5pY29sYXNpdXMqLCB3ZXJlIGNvbnNpZGVyZWQgaW52YXNpdmUgYnkgdGhlIHN0YXRlIG9mIE5ldyBZb3JrIChTdGF0ZSBvZiBOZXcgWW9yaywgMjAyMikgKFRhYmxlIDMpLg0KDQp8ICAgUmVsYXRpdmUgY292ZXIgb2YgdGhlIG1ham9yaXR5IG9mIHRoZXNlIGludmFzaXZlIHNwZWNpZXMgZWl0aGVyIHJlbWFpbmVkIHN0YWJsZSBvdmVyIHRoZSBjb3Vyc2Ugb2YgdGhlIHN0dWR5IHBlcmlvZCBvciB3ZXJlIG9ubHkgZm91bmQgb25jZSAoRmlndXJlIDMpLiBPZiB0aGUgdHdvIGludmFzaXZlIHNwZWNpZXMgd2l0aCBpbmNyZWFzaW5nIHJlbGF0aXZlIGNvdmVyLCAqUGhyYWdtaXRlcyBhdXN0cmFsaXMqIGF0IENBQ08gaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBTY2lOYW1lX2NvciA9PSAiUGhyYWdtaXRlcyBhdXN0cmFsaXMiKSAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBpbnZhc2l2ZV9jb3ZlciwgbiA9IDEpICU+JSBtdXRhdGUobSA9IHJvdW5kKGludmFzaXZlX2NvdmVyLDEpKSAlPiUgcHVsbCgpYCUgaW4gYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiQ0FDTyIgJiBTY2lOYW1lX2NvciA9PSAiUGhyYWdtaXRlcyBhdXN0cmFsaXMiKSAlPiUgdW5ncm91cCgpICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBpbnZhc2l2ZV9jb3ZlciwgbiA9IDEpICU+JSBzZWxlY3QoWWVhcikgJT4lIHB1bGwoKWAgdG8gYSBoaWdoIG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBocmFnbWl0ZXMgYXVzdHJhbGlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgLCBhbHRob3VnaCB0aGlzIGNoYW5nZSBtYXkgYmUgcmVsYXRlZCB0byBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIHNpdGVzIHVzZWQgaW4gdGhlIGVhcmxpZXIgdnMuIGxhdGVyIHllYXJzIGF0IENBQ08uIFNpbWlsYXJseSwgdGhlIGNvdmVyIG9mICpBcnRlbWlzaWEgdnVsZ2FyaXMqIGF0IEdBVEUgaW5jcmVhc2VkIGZyb20gYSBsb3cgb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIgJiBTY2lOYW1lX2NvciA9PSAiQXJ0ZW1pc2lhIHZ1bGdhcmlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiICYgU2NpTmFtZV9jb3IgPT0gIkFydGVtaXNpYSB2dWxnYXJpcyIpICU+JSB1bmdyb3VwKCkgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IGludmFzaXZlX2NvdmVyLCBuID0gMSkgJT4lIHNlbGVjdChZZWFyKSAlPiUgcHVsbCgpYCB0byBhIGhpZ2ggb2YgYHIgaW52YXNpdmVfY292ZXJfcGVyX3llYXIgJT4lIGZpbHRlcihVbml0Q29kZSA9PSAiR0FURSIgJiBTY2lOYW1lX2NvciA9PSAiQXJ0ZW1pc2lhIHZ1bGdhcmlzIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkdBVEUiICYgU2NpTmFtZV9jb3IgPT0gIkFydGVtaXNpYSB2dWxnYXJpcyIpICU+JSB1bmdyb3VwKCkgJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IGludmFzaXZlX2NvdmVyLCBuID0gMSkgJT4lIHNlbGVjdChZZWFyKSAlPiUgcHVsbCgpYCAoRmlndXJlIDMpLiBPbmx5IDEgaW52YXNpdmUgc3BlY2llcywgKlBoYWxhcmlzIGFydW5kaW5hY2VhKiBhdCBDQUNPIGRlY3JlYXNlZCBzdWJzdGFudGlhbGx5IGZyb20gYSBoaWdoIG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgIHRvIGEgbG93IG9mIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgbXV0YXRlKG0gPSByb3VuZChpbnZhc2l2ZV9jb3ZlciwxKSkgJT4lIHB1bGwoKWAlIGluIGByIGludmFzaXZlX2NvdmVyX3Blcl95ZWFyICU+JSBmaWx0ZXIoVW5pdENvZGUgPT0gIkNBQ08iICYgU2NpTmFtZV9jb3IgPT0gIlBoYWxhcmlzIGFydW5kaW5hY2VhIikgJT4lIHVuZ3JvdXAoKSAlPiUgc2xpY2VfbWluKG9yZGVyX2J5ID0gaW52YXNpdmVfY292ZXIsIG4gPSAxKSAlPiUgc2VsZWN0KFllYXIpICU+JSBwdWxsKClgIChGaWd1cmUgMykuDQombmJzcDsNCg0KYGBge3IgVGFibGUgMywgZWNobz1GQUxTRSwgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIHBhZ2VkLnByaW50PVRSVUV9DQpmbGV4dGFibGUoaW52YXNpdmVfc3BlY2llc19ieV9wYXJrLCBjb2xfa2V5cyA9IGMoIlVuaXRDb2RlIiwgIlNjaU5hbWVfY29yIikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDMuIEludmFzaXZlLCBub3hpb3VzLCBvciBwcm9oaWJpdGVkIHNwZWNpZXMgZm91bmQgYXQgZWFjaCBwYXJrLiIpKSAlPiUNCiAgc2V0X2hlYWRlcl9sYWJlbHMoLiwgVW5pdENvZGUgPSAiUGFyayB1bml0IiwgU2NpTmFtZV9jb3IgPSAiU3BlY2llcyIpICU+JQ0KICBhbGlnbiguLCBpID0gMSwgYWxpZ24gPSAibGVmdCIsIHBhcnQgPSAiaGVhZGVyIikgJT4lDQogIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgc3R5bGUoaiA9IDIsIHByX3QgPSBmcF90ZXh0X2RlZmF1bHQoaXRhbGljID0gVFJVRSkpICU+JQ0KICBobGluZSguLCBpID0gYyg1LDYsOSksIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMSkpICU+JQ0KICBobGluZSguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDIpLCBwYXJ0ID0gImZvb3RlciIpICU+JQ0KICBtZXJnZV92KC4sIGogPSAxKSAlPiUNCiAgZml4X2JvcmRlcl9pc3N1ZXMoKSAlPiUNCiAgcGFkZGluZyguLCBpID0gYygxLCA2LCA3LCAxMCksIGogPSAyLCBwYWRkaW5nLnRvcCA9IDUpICU+JQ0KICBwYWRkaW5nKC4sIGkgPSBjKDUsIDYsIDksIDEzKSwgaiA9IDIsIHBhZGRpbmcuYm90dG9tID0gNSkNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEZpZ3VyZSA0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90KGludmFzaXZlX2NvdmVyX3Blcl95ZWFyLCBhZXMoeCA9IFllYXIsIHkgPSBpbnZhc2l2ZV9jb3ZlcikpICsNCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFNjaU5hbWVfY29yKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFNjaU5hbWVfY29yKSkgKw0KICBnZW9tX3RleHQoZGF0YSA9DQogICAgICAgICAgICAgIGRhdGEuZnJhbWUoVW5pdENvZGUgPSBjKCJDQUNPIiwgIkNPTE8iLCAiRklJUyIsICJHQVRFIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxldHRlciA9IExFVFRFUlNbMTo0XSksDQogICAgICAgICAgICBhZXMoeCA9IDE5OTcsIHkgPSAgOTMsIGxhYmVsID0gcGFzdGUwKGxldHRlciwgIi4gIiwgVW5pdENvZGUpKSwNCiAgICAgICAgICAgIGhqdXN0ID0gMCwgZmFtaWx5ID0gInNlcmlmIikgKw0KICBsZW1vbjo6ZmFjZXRfcmVwX3dyYXAoflVuaXRDb2RlLCByZXBlYXQudGljay5sYWJlbHMgPSBUKSArDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiTWVhbiByZWxhdGl2ZSBjb3ZlciAoJSkiKSArDQogIHNjYWxlX3hfY29udGludW91cyhzZWMuYXhpcyA9IGR1cF9heGlzKCksIG5hbWUgPSAiWWVhciIpICsNCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIlNwZWNpZXMiKSkgKw0KICBsZmVoZVI6OnRoZW1lKGJhc2Vfc2l6ZSA9IDEyKSArDQogIHRoZW1lKA0KICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gInNlcmlmIiwgc2l6ZSA9IDEyKSwNCiAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9yZWN0KGNvbG9yID0gInRyYW5zcGFyZW50IiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUsIGxpbmV0eXBlID0gImRhc2hlZCIpLA0KICAgIHBhbmVsLnNwYWNpbmcueSA9IHVuaXQoNSwibW0iKSwNCiAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KYGBgDQombmJzcDsNCg0KIyMjIyMgKldldGxhbmQgU3BlY2llcyoNCmBgYHtyIFdldGxhbmQgc3BlY2llcywgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQp3ZXRsYW5kX3NwZWNpZXMgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoU2NpTmFtZV9jb3IgIT0gIlJ1cHBpYSBtYXJpdGltYSIpICU+JSAjIGV4Y2x1ZGUgcnVwcGlhIGNvdmVyIC0gc2hvdWxkbid0IGhhdmUgYmVlbiBjb3VudGVkIGFzIGEgc2FsdCBtYXJzaCBzcGVjaWVzDQogIHNlbGVjdChVbml0Q29kZSwgWWVhcl9jaHIsIHJlbF9wZXJjZW50X2NvdmVyLCBTY2lOYW1lX2Nvciwgd2V0bGFuZF9zdGF0dXMpICU+JQ0KICBmaWx0ZXIod2V0bGFuZF9zdGF0dXMgJWluJSBjKCJPQkwiLCAiRkFDVyIsICJGQUMiKSkgDQoNCnRvdGFsX3dldGxhbmRfc3BlY2llcyA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIHN1bW1hcmlzZShuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkgJT4lDQogIHB1bGwoKSAlPiUNCiAgYXMubnVtZXJpYygpDQoNCndldGxhbmRfc3BlY2llc19wZXJfcGFyayA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlKSAlPiUNCiAgZGlzdGluY3QoU2NpTmFtZV9jb3IpICU+JQ0KICBhcnJhbmdlKFVuaXRDb2RlLCBTY2lOYW1lX2NvcikNCg0Kd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrIDwtIHdldGxhbmRfc3BlY2llc19wZXJfcGFyayAlPiUNCiAgc3VtbWFyaXNlKHNwZWNpZXNfY291bnQgPSBuX2Rpc3RpbmN0KFNjaU5hbWVfY29yKSkNCg0KdG90YWxfd2V0bGFuZF9jb3Zlcl9wZXJfeWVhciA8LSB3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihZZWFyX2NocikpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcikgJT4lDQogIHN1bW1hcmlzZSh3ZXRsYW5kX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlcikpIA0KDQp3ZXRsYW5kX2NvdmVyX3RvcDUgPC0gcGxvdF92ZWdfY292ZXJfdXNkYSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoVW5pdENvZGUsIFllYXJfY2hyLCBQZXJjZW50Q292ZXIsIHRvdGFsX3BlcmNlbnRfY292ZXIsIHJlbF9wZXJjZW50X2NvdmVyLCBTY2lOYW1lX2Nvciwgd2V0bGFuZF9zdGF0dXMpICU+JQ0KICBtdXRhdGUoaXNfd2V0bGFuZCA9IGlmX2Vsc2Uod2V0bGFuZF9zdGF0dXMgJWluJSBjKCJPQkwiLCAiRkFDVyIsICJGQUMiKSwgIlQiLCBOQSkpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NociwgU2NpTmFtZV9jb3IpICU+JQ0KICBtdXRhdGUodG90YWxfY292ZXJfc3BlY2llcyA9IHN1bShyZWxfcGVyY2VudF9jb3ZlcikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIGdyb3VwX2J5KFVuaXRDb2RlLCBZZWFyX2NocikgJT4lDQogIG11dGF0ZSh0b3RhbF9jb3ZlciA9IHN1bSh0b3RhbF9wZXJjZW50X2NvdmVyKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFllYXJfY2hyLCBTY2lOYW1lX2NvcikgJT4lDQogIGZpbHRlcihpc193ZXRsYW5kID09ICJUIikgJT4lDQogIHN1bW1hcmlzZShtZWFuX3JlbF9jb3Zlcl9zcGVjaWVzID0gbWVhbih0b3RhbF9jb3Zlcl9zcGVjaWVzL3RvdGFsX2NvdmVyLCBuYS5ybSA9VCApKjEwMCkgJT4lDQogIGZpbHRlcihTY2lOYW1lX2NvciAhPSAiUnVwcGlhIG1hcml0aW1hIikgJT4lICMgZXhjbHVkZSBydXBwaWEgY292ZXIgLSBzaG91bGRuJ3QgaGF2ZSBiZWVuIGNvdW50ZWQgYXMgYSBzYWx0IG1hcnNoIHNwZWNpZXMNCiAgZ3JvdXBfYnkoVW5pdENvZGUsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKHBhcmtfbWVhbl9yZWxfY292ZXIgPSBtZWFuKG1lYW5fcmVsX2NvdmVyX3NwZWNpZXMsIG5hLnJtID0gVCkpICU+JQ0KICBzbGljZV9tYXgobiA9IDUsIG9yZGVyX2J5ID0gcGFya19tZWFuX3JlbF9jb3ZlcikgJT4lDQogIGFycmFuZ2UoVW5pdENvZGUsIGRlc2MocGFya19tZWFuX3JlbF9jb3ZlcikpDQpgYGANCg0KfCAgIE9mIHRoZSBgciB0b3RhbF9zcGVjaWVzYCB1bmlxdWUgc3BlY2llcyBpZGVudGlmaWVkIGFjcm9zcyBhbGwgcGFya3MsIGByIHRvdGFsX3dldGxhbmRfc3BlY2llc2Agd2VyZSBjb25zaWRlcmVkIGh5ZHJvcGh5dGljIGluIHRoZSBub3J0aGVhc3Qgd2V0bGFuZCByZWdpb24gKFUuUy4gQXJteSBDb3JwcyBvZiBFbmdpbmVlcnMgMjAwOSkgYmFzZWQgb24gdGhlaXIgY2hhcmFjdGVyaXphdGlvbiBhcyBlaXRoZXIgb2JsaWdhdGUsIGZhY3VsdGF0aXZlIHdldGxhbmQsIG9yIGZhY3VsYXRpdmUgb24gdGhlIE5hdGlvbmFsIFdldGxhbmQgUGxhbnQgTGlzdCAoTGljaHZhciBldCBhbC4gMjAxNikuIFRvdGFsIHdldGxhbmQgc3BlY2llcyByaWNobmVzcyByYW5nZWQgZnJvbSBhIGxvdyBvZiBgciB3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3BhcmsgJT4lIHNsaWNlX21pbihvcmRlcl9ieSA9IHNwZWNpZXNfY291bnQsIG4gPSAxKSAlPiUgcHVsbChzcGVjaWVzX2NvdW50KWAgYXQgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSBzbGljZV9taW4ob3JkZXJfYnkgPSBzcGVjaWVzX2NvdW50LCBuID0gMSkgJT4lIHB1bGwoVW5pdENvZGUpYCB0byBhIGhpZ2ggb2YgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSBzbGljZV9tYXgob3JkZXJfYnkgPSBzcGVjaWVzX2NvdW50LCBuID0gMSkgJT4lIHB1bGwoc3BlY2llc19jb3VudClgIGF0IGByIHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayAlPiUgc2xpY2VfbWF4KG9yZGVyX2J5ID0gc3BlY2llc19jb3VudCwgbiA9IDEpICU+JSBwdWxsKFVuaXRDb2RlKWAgKG1lYW46IGByIHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayAlPiUgdW5ncm91cCgpICU+JSBzdW1tYXJpc2UobSA9IHJvdW5kKG1lYW4oc3BlY2llc19jb3VudCksMCkpICU+JSBwdWxsIChtKWAgwrEgYHIgd2V0bGFuZF9zcGVjaWVzX2NvdW50X3Blcl9wYXJrICU+JSB1bmdyb3VwKCkgJT4lIHN1bW1hcmlzZShtID0gcm91bmQoc2Qoc3BlY2llc19jb3VudCkvc3FydChsZW5ndGgoc3BlY2llc19jb3VudCkpLDApKSAlPiUgcHVsbCAobSlgOyBUYWJsZSA0KS4NCiZuYnNwOw0KDQpgYGB7ciBUYWJsZSA0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZmxleHRhYmxlKHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyaywgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJzcGVjaWVzX2NvdW50IikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDQuIFRvdGFsIGh5ZHJvcGh5dGUgc3BlY2llcyByaWNobmVzcyBhdCBlYWNoIHBhcmsgdW5pdC4iKSkgJT4lDQogIHNldF9oZWFkZXJfbGFiZWxzKC4sIFVuaXRDb2RlID0gIlBhcmsgdW5pdCIsIHNwZWNpZXNfY291bnQgPSAiVG90YWwgaHlkcm9waHl0ZSBzcGVjaWVzIHJpY2huZXNzIikgJT4lDQogIGFsaWduKC4sIGkgPSAxLCBhbGlnbiA9ICJsZWZ0IiwgcGFydCA9ICJoZWFkZXIiKSAlPiUNCiAgYm9yZGVyX2lubmVyX2goLiwgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gInRyYW5zcGFyZW50IiksIHBhcnQgPSAiYm9keSIpICU+JQ0KICBhZGRfZm9vdGVyX3JvdyguLCB2YWx1ZXMgPSBjKCJtZWFuICgrLy0gMSBTRSkiLCBwYXN0ZTAocm91bmQobWVhbih3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3Bhcmskc3BlY2llc19jb3VudCksMCksICIgKy8tICIsIHJvdW5kKHNkKHdldGxhbmRfc3BlY2llc19jb3VudF9wZXJfcGFyayRzcGVjaWVzX2NvdW50KS9zcXJ0KGxlbmd0aCh3ZXRsYW5kX3NwZWNpZXNfY291bnRfcGVyX3Bhcmskc3BlY2llc19jb3VudCkpLDApKSksIGNvbHdpZHRocyA9IGMoMSwxKSkgJT4lIA0KICBobGluZSguLCBpID0gNywgYm9yZGVyID0gZnBfYm9yZGVyKGNvbG9yID0gImJsYWNrIiwgd2lkdGggPSAxKSkgJT4lDQogIGhsaW5lKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJibGFjayIsIHdpZHRoID0gMiksIHBhcnQgPSAiZm9vdGVyIikgJT4lDQogIGFsaWduKC4sIGFsaWduID0gImNlbnRlciIsIHBhcnQgPSAiZm9vdGVyIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIFRhYmxlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZmxleHRhYmxlKHdldGxhbmRfY292ZXJfdG9wNSwgY29sX2tleXMgPSBjKCJVbml0Q29kZSIsICJTY2lOYW1lX2NvciIsICJwYXJrX21lYW5fcmVsX2NvdmVyIikpICU+JQ0KICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICBzZXRfdGFibGVfcHJvcGVydGllcyguLCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JQ0KICBhZGRfaGVhZGVyX2xpbmVzKC4sIHZhbHVlcyA9IGMoIlRhYmxlIDUuIEh5ZHJvcGh5dGljIHBsYW50IGNvdmVyIHNwZWNpZXMgd2l0aCB0aGUgdG9wIDUgaGlnaGVzdCByZWxhdGl2ZVxubWVhbiBjb3ZlciBhdCBlYWNoIHBhcmsgYWNjcm9zcyBhbGwgeWVhcnMuIikpICU+JQ0KICBzZXRfaGVhZGVyX2xhYmVscyguLCBVbml0Q29kZSA9ICJQYXJrIHVuaXQiLCBTY2lOYW1lX2NvciA9ICJTcGVjaWVzIiwgcGFya19tZWFuX3JlbF9jb3ZlciA9ICJDb3ZlciAoJSkiKSAlPiUNCiAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICBib3JkZXJfaW5uZXJfaCguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAidHJhbnNwYXJlbnQiKSwgcGFydCA9ICJib2R5IikgJT4lDQogIHN0eWxlKGogPSAyLCBwcl90ID0gZnBfdGV4dF9kZWZhdWx0KGl0YWxpYyA9IFRSVUUpKSAlPiUNCiAgY29sZm9ybWF0X2RvdWJsZSguLCBqID0gMywgZGlnaXRzID0gMSkgJT4lDQogICMgaGxpbmUoLiwgaSA9IGMoNSw2LDkpLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDEpKSAlPiUNCiAgIyBobGluZSguLCBib3JkZXIgPSBmcF9ib3JkZXIoY29sb3IgPSAiYmxhY2siLCB3aWR0aCA9IDIpLCBwYXJ0ID0gImZvb3RlciIpICU+JQ0KICBtZXJnZV92KC4sIGogPSAxKSAlPiUNCiAgZml4X2JvcmRlcl9pc3N1ZXMoKSAlPiUNCiAgcGFkZGluZyguLCBpID0gYygxLCA2LCAxMSwgMTYsIDIxLCAyNiwgMzEpLCBqID0gMiwgcGFkZGluZy50b3AgPSA1KSAlPiUNCiAgcGFkZGluZyguLCBpID0gYyg1LCAxMCwgMTUsIDIwLCAyNSwgMzApLCBqID0gMiwgcGFkZGluZy5ib3R0b20gPSA1KQ0KYGBgDQombmJzcDsNCg0KYGBge3IgRmlndXJlIDUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KZ2dwbG90KHdldGxhbmRfY292ZXJfcGVyX3llYXIsIGFlcyh4ID0gWWVhciwgeSA9IHdldGxhbmRfY292ZXIpKSArDQogIGdlb21fbGluZShhZXMoY29sb3IgPSBVbml0Q29kZSkpIA0KYGBgDQombmJzcDsNCmBgYHtyLCBmaWcud2lkdGg9NC42NDU4MzMsIGZpZy5oZWlnaHQ9My45MTY2Njd9DQp3ZXRsYW5kX3NwZWNpZXMgJT4lDQogIGZpbHRlcihVbml0Q29kZSA9PSAiQVNJUyIpICU+JQ0KICBncm91cF9ieShVbml0Q29kZSwgWWVhcl9jaHIsIFNjaU5hbWVfY29yKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcmVsX2NvdmVyID0gbWVhbihyZWxfcGVyY2VudF9jb3ZlciwgbmEucm0gPVQpKSAlPiUNCiAgcGl2b3Rfd2lkZXIoLiwgaWRfY29scyA9IGMoIlVuaXRDb2RlIiwgIlllYXJfY2hyIiksIG5hbWVzX2Zyb20gPSBTY2lOYW1lX2NvciwgdmFsdWVzX2Zyb20gPSBjKG1lYW5fcmVsX2NvdmVyKSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKC4sIGNvbHMgPSAtYygiVW5pdENvZGUiLCAiWWVhcl9jaHIiKSwgbmFtZXNfdG8gPSAiU2NpTmFtZV9jb3IiLCB2YWx1ZXNfdG8gPSAibWVhbl9yZWxfY292ZXIiKSAlPiUNCiAgbXV0YXRlKGNvdmVyX2NhdGVnb3J5ID0gZmFjdG9yKGNhc2Vfd2hlbigNCiAgICBtZWFuX3JlbF9jb3ZlciA9PSAwIH4gTkEsDQogICAgbWVhbl9yZWxfY292ZXIgPiAwICYgbWVhbl9yZWxfY292ZXIgPCAyIH4gImIxJSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiAyICYgbWVhbl9yZWxfY292ZXIgPD0gNCB+ICJjMi00JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiA0ICYgbWVhbl9yZWxfY292ZXIgPD0gOSB+ICJkNS05JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiA5ICYgbWVhbl9yZWxfY292ZXIgPD0gMjQgfiAiZTEwLTI0JSIsDQogICAgbWVhbl9yZWxfY292ZXIgPiAyNSAmIG1lYW5fcmVsX2NvdmVyIDw9IDQ5IH4gImYyNS00OSUiLA0KICAgIG1lYW5fcmVsX2NvdmVyID4gNDkgJiBtZWFuX3JlbF9jb3ZlciA8PSA3NCB+ICJnNTAtNzQlIiwNCiAgICBtZWFuX3JlbF9jb3ZlciA+IDc0IH4gImg3NS0xMDAlIg0KICApKSkgJT4lDQogIG11dGF0ZShTY2lOYW1lX2NvciA9IGZhY3RvcihTY2lOYW1lX2NvciwgbGV2ZWxzPXJldihzb3J0KHVuaXF1ZShTY2lOYW1lX2NvcikpKSkpICU+JQ0KICBnZ3Bsb3QoLiwgYWVzKHggPSBZZWFyX2NociwgeSA9IFNjaU5hbWVfY29yLCBmaWxsID0gY292ZXJfY2F0ZWdvcnkpKSArDQogIGdlb21fdGlsZShjb2xvciA9ICJsaWdodCBncmV5Iiwgc2l6ZSA9IDAuMjUpICsNCiAgc2NhbGVfeV9kaXNjcmV0ZShleHBhbmQgPSBjKDAsMCksIG5hbWUgPSAiIikgKw0KICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZCA9IGMoMCwwKSwgbmFtZSA9ICIiKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHR5cGUgPSAic2VxIiwgcGFsZXR0ZSA9ICJZbEduIiwgbmFtZSA9ICJNZWFuIHJlbGF0aXZlXG5jb3ZlciAoJSkiKSArDQogIGxmZWhlUjo6dGhlbWUoKSArDQogIHRoZW1lX2dyZXkoYmFzZV9zaXplPTgpICsNCiAgdGhlbWUoDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gInRyYW5zcGFyZW50IiksDQogICAgYXhpcy50aWNrcz1lbGVtZW50X2xpbmUobGluZXdpZHRoPTAuNCkNCiAgKQ0KYGBgDQoNCiZuYnNwOw0KDQojIyMjIyAqKkRpc2N1c3Npb24qKg0KU3BlY2llcyByaWNobmVzcyBwZXIgcGxvdCBhdCBhbGwgcGFya3MgKGV4Y2VwdCBDQUNPIHByaW9yIHRvIDIwMDUpIHdhcyBzaW1pbGFyIHRvIHRoYXQgb2Ygb3RoZXIgc2FsdCBtYXJzaGVzIGFsb25nIHRoZSBlYXN0ZXJuIEF0bGFudGljIGNvYXN0IG9mIE5vcnRoIEFtZXJpY2EgKGNpdGF0aW9ucyBoZXJlKS4NCg0KTGl0ZXJhdHVyZSBDaXRlZA0KDQpMaWNodmFyLCBSLlcuLCBELkwuIEJhbmtzLCBXLk4uIEtpcmNobmVyLCBhbmQgTi5DLiBNZWx2aW4uIDIwMTYuIFRoZSBOYXRpb25hbCBXZXRsYW5kIFBsYW50IExpc3Q6IDIwMTYgd2V0bGFuZCByYXRpbmdzLiBQaHl0b25ldXJvbiAyMDE2LTMwOiAxLTE3LiAoU2VlIGFsc28gdGhlIG9mZmljaWFsIHdlYnNpdGUgb2YgdGhlIE5hdGlvbmFsIFdldGxhbmQgUGxhbnQgTGlzdC4pDQoNClN0YXRlIG9mIE5ldyBZb3JrLiAyMDIyLsKgW05ldyBZb3JrIExhd3MsIEVudmlyb25tZW50YWwgQ29uc2VydmF0aW9uIMKnIDktMTcwXShodHRwczovL2xhdy5qdXN0aWEuY29tL2NvZGVzL25ldy15b3JrLzIwMjIvZW52L2FydGljbGUtOS90aXRsZS0xNy85LTE3MDkvKS4gTmV3IFlvcmsgRGVwYXJ0bWVudCBvZiBTdGF0ZS4gMjAyMS7CoFs2IE5ldyBZb3JrIENvZGVzLCBSdWxlcyBhbmQgUmVndWxhdGlvbnMgUGFydCA1NzU6IFByb2hpYml0ZWQgYW5kIFJlZ3VsYXRlZCBJbnZhc2l2ZSBTcGVjaWVzXShodHRwczovL2dvdnQud2VzdGxhdy5jb20vbnljcnIvQnJvd3NlL0hvbWUvTmV3WW9yay9OZXdZb3JrQ29kZXNSdWxlc2FuZFJlZ3VsYXRpb25zP2d1aWQ9SWU4ZDNlN2IwMzM5NjExZTRiYWEyMDAwMDg0NWI4ZDNlJm9yaWdpbmF0aW9uQ29udGV4dD1kb2N1bWVudHRvYyZ0cmFuc2l0aW9uVHlwZT1EZWZhdWx0JmNvbnRleHREYXRhPShzYy5EZWZhdWx0KSkuDQoNClUuUy4gQXJteSBDb3JwcyBvZiBFbmdpbmVlcnMuIDIwMDkuIFJlZ2lvbmFsIHN1cHBsZW1lbnQgdG8gdGhlIENvcnBzIG9mIEVuZ2luZWVycyBXZXRsYW5kIERlbGluZWF0aW9uIE1hbnVhbDogTm9ydGhjZW50cmFsIGFuZCBOb3J0aGVhc3QgUmVnaW9uLiBVLlMuIEFybXkgQ29ycHMgb2YgRW5naW5lZXJzLCBFbmdpbmVlciBSZXNlYXJjaCBhbmQgRGV2ZWxvcG1lbnQgQ2VudGVyLCBFbnZpcm9ubWVudGFsIExhYm9yYXRvcnkgRVJEQy9FTCBUUi0wOS0xOS4NCg0KYGBge3IgQXBwZW5kaXggMTogU3BlY2llcyBsaXN0cyBmb3IgZWFjaCBwYXJrLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1biA8LSBmdW5jdGlvbihwYXJrX2NvZGUsIGxldHRlciwgcGFyaykgew0KICBzcGVjaWVzX3Blcl9wYXJrICU+JQ0KICAgIHVuZ3JvdXAoKSAlPiUNCiAgICBmaWx0ZXIoVW5pdENvZGUgPT0gcGFya19jb2RlKSAlPiUNCiAgICBzZWxlY3QoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGFycmFuZ2UoU2NpTmFtZV9jb3IpICU+JQ0KICAgIGxlZnRfam9pbiguLCBwbG90X3ZlZ19jb3Zlcl91c2RhICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpICU+JSBkaXN0aW5jdChTY2lOYW1lX2NvciwgQ29tbW9uTmFtZSwgQWNjZXB0ZWRTeW1ib2wpLCBieSA9ICJTY2lOYW1lX2NvciIpICU+JQ0KICAgIGZsZXh0YWJsZSguKSAlPiUNCiAgICBhbGlnbiguLCBhbGlnbiA9ICJjZW50ZXIiLCBwYXJ0ID0gImFsbCIpICU+JQ0KICAgIHNldF90YWJsZV9wcm9wZXJ0aWVzKC4sIGxheW91dCA9ICJhdXRvZml0IikgJT4lDQogICAgYWRkX2hlYWRlcl9saW5lcyguLCB2YWx1ZXMgPSBjKHBhc3RlMCgiQXBwZW5kaXggMSIsIGxldHRlciwgIi4gU2FsdCBtYXJzaCBwbGFudCBzcGVjaWVzIGxpc3QgZm9yICIsIHBhcmssICIuIikpKSAlPiUNCiAgICBzZXRfaGVhZGVyX2xhYmVscyguLCBTY2lOYW1lX2NvciA9ICJTcGVjaWVzIiwgQ29tbW9uTmFtZSA9ICJDb21tb24gTmFtZSIsIEFjY2VwdGVkU3ltYm9sID0gIlVTREEgU3ltYm9sIikgJT4lDQogICAgYWxpZ24oLiwgaSA9IDEsIGFsaWduID0gImxlZnQiLCBwYXJ0ID0gImhlYWRlciIpICU+JQ0KICAgIGJvcmRlcl9pbm5lcl9oKC4sIGJvcmRlciA9IGZwX2JvcmRlcihjb2xvciA9ICJ0cmFuc3BhcmVudCIpLCBwYXJ0ID0gImJvZHkiKSAlPiUNCiAgICBzdHlsZShqID0gMSwgcHJfdCA9IGZwX3RleHRfZGVmYXVsdChpdGFsaWMgPSBUUlVFKSkgDQp9DQpgYGANCg0KYGBge3IgQXBwZW5kaXggMUE6IFNwZWNpZXMgbGlzdHMgZm9yIEFTSVMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJBU0lTIiwgbGV0dGVyID0gIkEiLCBwYXJrID0gIkFzc2F0ZWFndWUgSXNsYW5kIE5hdGlvbmFsIFNlYXNob3JlIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDFCOiBTcGVjaWVzIGxpc3RzIGZvciBDQUNPLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiQ0FDTyIsIGxldHRlciA9ICJCIiwgcGFyayA9ICJDYXBlIENvZCBOYXRpb25hbCBTZWFzaG9yZSIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAxQzogU3BlY2llcyBsaXN0cyBmb3IgQ09MTywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkNPTE8iLCBsZXR0ZXIgPSAiQyIsIHBhcmsgPSAiQ29sb25pYWwgTmF0aW9uYWwgSGlzdG9yaWNhbCBQYXJrIikNCmBgYA0KJm5ic3A7DQoNCmBgYHtyIEFwcGVuZGl4IDFEOiBTcGVjaWVzIGxpc3RzIGZvciBGSUlTLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3BlY2llc19saXN0X3RhYmxlX2Z1bihwYXJrX2NvZGUgPSAiRklJUyIsIGxldHRlciA9ICJEIiwgcGFyayA9ICJGaXJlIElzbGFuZCBOYXRpb25hbCBTZWFzaG9yZSIpDQpgYGANCiZuYnNwOw0KDQpgYGB7ciBBcHBlbmRpeCAxRTogU3BlY2llcyBsaXN0cyBmb3IgR0FURSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNwZWNpZXNfbGlzdF90YWJsZV9mdW4ocGFya19jb2RlID0gIkdBVEUiLCBsZXR0ZXIgPSAiRSIsIHBhcmsgPSAiR2F0ZXdheSBOYXRpb25hbCBSZWNyZWF0aW9uIEFyZWEiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMUY6IFNwZWNpZXMgbGlzdHMgZm9yIEdFV0EsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJHRVdBIiwgbGV0dGVyID0gIkYiLCBwYXJrID0gIkdlb3JnZSBXYXNoaW5ndG9uIEJpcnRocGxhY2UgTmF0aW9uYWwgTW9udW1lbnQiKQ0KYGBgDQombmJzcDsNCg0KYGBge3IgQXBwZW5kaXggMUc6IFNwZWNpZXMgbGlzdHMgZm9yIFNBSEksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzcGVjaWVzX2xpc3RfdGFibGVfZnVuKHBhcmtfY29kZSA9ICJTQUhJIiwgbGV0dGVyID0gIkciLCBwYXJrID0gIlNhZ2Ftb3JlIEhpbGwgTmF0aW9uYWwgSGlzdG9yaWMgU2l0ZSIpDQpgYGANCiZuYnNwOw0K